2013-10-31 6 views
3
char f1(); 
void f2(char&); 

struct A {}; 

A f3(); 
void f4(A&); 

int main() 
{ 
    f2(f1()); // error C2664. This is as expected. 
    f4(f3()); // OK! Why??? 
} 

오류 C2664 : '무효 F4 (문자 &)는'내가 해왔 던비 const 참조 매개 변수를 임시 개체에 바인딩 할 수 있습니까?

'문자 &'에 '문자'에서 인수 1을 변환 할 수있는 const가 아닌 C++에서 참조 매개 변수는 임시 객체에 바인딩 될 수 없습니다. 위의 코드에서 f2(f1());은 예상대로 오류를 트리거합니다.

그러나 동일한 규칙이 코드 줄 f4(f3());에 적용되지 않는 이유는 무엇입니까?

추 신 : 내 컴파일러는 VC++ 2013입니다. f2(f1()); 행에 주석을 추가하더라도 f4(f3()); 코드는 오류나 경고없이 컴파일됩니다.

는 업데이트 :

MSDN는 말한다 : 비주얼 C++의 이전 릴리스에서는

는 const가 아닌 참조는 임시 개체에 를 결합 할 수있다. 이제 임시 객체는 const 참조에 으로 만 바인딩 할 수 있습니다.

그래서 저는 VC++의 버그라고 생각합니다. 버그 리포트를 제출했습니다 VC++ team

+0

당신이 F2없이 구축 시도해 봤어 (F1()) 코드에서? 첫 번째 오류에서 중지되었을 수 있습니다. – scaryrawr

+0

'f2 (f1());'행에 주석을 달면 코드가 정상적으로됩니다. – xmllmx

+0

MSVC는 이것을 컴파일러 확장으로 지원하는 것으로 알려져 있습니다. 2013 년에 대해 확실하지 않습니다. – yngccc

답변

4

당신이 언어 확장을 사용하지 the /Za option 컴파일하는 경우 컴파일러는 거부 모두 전화 :

> cl /Za test.cpp 
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.21005.1 for x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

test.cpp 
test.cpp(11): error C2664: 'void f2(char &)' : cannot convert argument 1 from 'char' to 'char &' 
test.cpp(12): error C2664: 'void f4(A &)' : cannot convert argument 1 from 'A' to 'A &' 
     A non-const reference may only be bound to an lvalue 

이 몇 가지 (매우 제약 된) 상황에서 컴파일러와 GCC는 다음과 같은 오류를 제공합니다 언어 확장을 사용하는 경우에도 비 const lvalue 참조가 rvalue 표현식에 바인딩 될 수 있습니다. 필자가 알고있는 사실은 이것이이 "확장"에 의존하는 몇 가지 거대한 레거시 코드베이스를 손상시키지 않는 것입니다.

(일반적으로는,의/ZA 사용은 여러 가지 이유로 권장하지 않습니다,하지만 대부분는 Windows SDK 헤더가/ZA 옵션을 #include하는 수 없습니다.)

2

당신은 컴파일러가 표준에 맞지 않습니다 (어쩌면 이것은 문서화 된 컴파일러 확장입니까?).

main.cpp: In function 'int main()': 
main.cpp:11:11: error: invalid initialization of non-const reference of type 'char&' from an rvalue of type 'char' 
    f2(f1()); // error C2664. This is as expected. 
     ^
main.cpp:2:6: error: in passing argument 1 of 'void f2(char&)' 
void f2(char&); 
    ^
main.cpp:12:12: error: invalid initialization of non-const reference of type 'A&' from an rvalue of type 'A' 
    f4(f3()); // OK! Why??? 
      ^
main.cpp:7:6: error: in passing argument 1 of 'void f4(A&)' 
void f4(A&);