2013-10-03 9 views
4

내 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

+2

"균일 한 초기화가 너무 균일하지 않다는 것을 알았습니다. *"당신 말이 맞고 더 많은 것에 동의하지 않습니다. –

답변

4

"통일 초기화"를 사용하고

는 제안 단계에서 초기화리스트 기능의 증진에 다소 불행하게도 사용 된 표준이 아닌 용어입니다.

아니요, 어디에서나 사용할 수 없습니다. 내 경험에 의하면, 그것은

  • 집계로 제한하는 것이 가장 좋습니다 (어떤 생성자; C++ (98)는 이미이 허용하지만 C++ 11 지원 확장) 값으로
  • 시퀀스 (initializer_list)
  • return을 명시 적이 지 않은 생성자를 호출하는 표현

의미가 바뀌고 모든 것이 바뀌지 않는다는 것을 알기 쉽게 설명하는 것은 논증 광고 비범 한 것입니다. 새롭고 다른 것이기 때문에 무언가를하는 것이 적절하기 때문입니다.

일반적인 프로그래밍의 경우 위의 카테고리에 걸친 상황을 올바르게 지원하기 어렵습니다. 특정 게시판에 메시지 보드 http://isocpp.org에 게시하십시오. 언어를 담당하는 사람들은 "균일 초기화"가 개선되어야하는 일반 주문을 복원하는 데 열심히 노력할 것입니다.

관련 문제