내 C++ 98 코드 중 일부를 C++ 11로 업데이트하는 동안 균일 한 초기화가 너무 균일하지 않다는 것을 알았습니다. 일부는 void
과 같이 불완전한 유형과 관련이 있고 다른 것은 포드와 관련되어 있습니다. 예 : 쉽게 복사 가능한 유형의 경우 초기화가 복사/이동 생성자를 포함 할 때 직접 초기화 또는 복사 초기화 모두에 대해 균일 초기화가 작동하지 않습니다.균일 한 초기화 구문에서 일부 유형이 작동하지 않는 이유는 무엇입니까?
예컨대 첫번째 부분은 컴파일 동안
template<class T>
T foo() { return T("Hello World");}
foo<void>();
foo<std::string>();
--------
template<class T>
T foo() { return T{"Hello World"};}
foo<void>();
foo<std::string>();
는 후반전 error: compound literal of non-object type 'void'
여기
struct pod { int x;int y;};
pod p{1,2}; //ok pod p(1,2) is error as usual
pod p2(p);
struct foo
{
foo(foo const& rhs) : p_(rhs.p_){}
pod p_;
};
--------
struct pod { int x;int y;};
pod p{1,2};
pod p2{p};
struct foo
{
foo(foo const& rhs) : p_{rhs.p_}{}
pod p_;
};
또한, 후반 error: cannot convert 'pod' to 'int' in initialization
복사 구성 실패 실패. 내 생각이지만,이 pod
클래스는 사소한 유형 (또는 사소하게 복사 가능한 유형이 될 수 있습니다) C++ (11)에 있지만, 문제는 원시적 형 제외 동일하게 유지
참고 : 다음 작품하는 동안
,
struct conv
{
operator int()const { return 1;}
};
pod p{1,2};
pod p2{conv{}};
이,하지 않는
struct conv
{
operator pod()const { return pod{1,2};}
};
pod p{1,2};
pod p2{conv{}};
나는 또한 작업 않습니다 C 배열을 발견 균일 한 초기화는 가능하지만 복사/이동 생성자에서는 그렇지 않습니다. 하지만 그것은 배열이 복사/이동 생성자 또는 할당을 가지지 않는 집계 때문일 수 있습니다. C++ 11에서 왜 구문이 허용되지 않는지는 모르지만 (특히 클래스 멤버 인 경우에는 암시 적 복사/이동이 정확하게 수행됩니다).
그래서 C++ 11의 초기화를 맹목적으로 C++ 11 초기화로 바꿀 수는 없습니까? (글쎄, 이니셜 라이저 목록을 가진 타입은 예외입니다!)? 내가 GCC에게 4.8.1
"균일 한 초기화가 너무 균일하지 않다는 것을 알았습니다. *"당신 말이 맞고 더 많은 것에 동의하지 않습니다. –