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
당신이 F2없이 구축 시도해 봤어 (F1()) 코드에서? 첫 번째 오류에서 중지되었을 수 있습니다. – scaryrawr
'f2 (f1());'행에 주석을 달면 코드가 정상적으로됩니다. – xmllmx
MSVC는 이것을 컴파일러 확장으로 지원하는 것으로 알려져 있습니다. 2013 년에 대해 확실하지 않습니다. – yngccc