2011-01-03 1 views
4

:C++ 11 초기화 구문 문제 (GCC와 함께 4.5/4.6) 란 무엇 다음과 같은 C++ (11) 코드를 잘못

struct S 
{ 
    int a; 
    float b; 
}; 

struct T 
{ 
    T(S s) {} 
}; 

int main() 
{ 
    T t(S{1, 0.1}); // ERROR HERE 
} 

GCC가 표시된 줄에서 오류를 제공는 (I는 모두 GCC를 시도 4.5 gcc의 실험 빌드 4.6)

유효하지 않은 C++ 11인가, gcc의 구현이 불완전합니까?

편집 : 여기에 컴파일러 오류입니다 :

test.cpp: In function int main(): 
test.cpp:14:10: error: expected) before { token 
test.cpp:14:10: error: a function-definition is not allowed here before { token 
test.cpp:14:18: error: expected primary-expression before) token 
test.cpp:14:18: error: expected ; before) token 
+0

후자는 일반적으로 특히 GCC4.5.x의 경우입니다. GCC4.6.x는 더 완벽하지만 버그가 있습니다. 가능한 경우 업데이트하십시오. – marko

답변

3

제안 N2640에, 당신의 코드가 작동한다고 따르면; 임시 S 객체가 만들어 져야합니다. g ++은이 문장을 (S가 예상되는 함수의) 선언으로 해석하려고 시도하기 때문에 버그처럼 보입니다.

+0

맞아요. 왜냐하면't ((S {1, 0.1}))'는 gcc에서 잘 작동하는 것 같습니다. –

0

은 괄호가없는 생성자를 호출하는 잘못된 것, 그리고이 작동하는 것 같다 :

struct S 
{ 
    int a; 
    float b; 
}; 

struct T 
{ 
    T(S s) {} 
}; 

int main() 
{ 
    T t(S({1, 0.1})); // NO ERROR HERE, due to nice constructor parentheses 
    T a({1,0.1}); // note that this works, as per link of Martin. 
} 

당신의 예제는 작동하지 않습니다 (적어도 나 :s에) 논리적 보인다. S를 vector<int>으로 바꾸면 같은 결과가됩니다.

vector<int> v{0,1,3}; // works 
T t(vector<int>{0,1,2}); // does not, but 
T t(vector<int>({0,1,2})); // does 
+0

'T a ({1,0.1});'과 똑같은 이유로 작동하지 않습니까? 즉'Tt (벡터 ({0,1,2}))가 아니다;'단지 벡터 '의 복사 생성자를 호출하는 것인가? – dvide

+0

글쎄, 여기서 할 수있는 두 가지 방법은 괄호를 삽입하거나 gcc 메일 링리스트에 메일을 보내이를 설명하는 것입니다. 내가 보는 주요 문제는이 기능에 대한 많은 제안과 추가 사항이 있으며 GCC가 구현하고자하는 것이 무엇인지 알지 못합니다. – rubenvb

+0

@dvide right. 'T a ({1, 0.1})'는'T '의 복사/이동 생성자를 호출하고,'T tmp = {1, 0.1}'에 의해 초기화 된 것처럼 임시로 생성자의 (reference-) 매개 변수를 초기화합니다. . 'S {1, 0.1} '대신'S ({1, 0.1})'라고 말하면 객체의 멤버를 직접 초기화하는 대신 쓸모없는 copy/move 생성자 호출을 추가하기 만하면됩니다. –