2009-08-28 11 views
9

임시 바인딩 내가 당신은 내가 세()이 변이 방법을 전달하고 볼 수있는 다음 코드를좌변 참조

string three() 
{ 
    return "three"; 
} 

void mutate(string& ref) 
{ 
} 

int main() 
{ 
    mutate(three()); 
    return 0; 
} 

있습니다. 이 코드는 잘 컴파일됩니다. 내 이해, temporaries 비 const 참조에 할당 할 수 없습니다. 그렇다면이 프로그램이 어떻게 컴파일되고 있습니까?

의견이 있으십니까?

편집 :

컴파일러는 시도 :

foo.cpp: In function ‘int main()’: 
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’ 
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’ 

(줄 번호는 : 그것은 ++ 4 적어도 g하지 컴파일, 를 않습니다

+0

GCC는 C++ 표준에 가깝습니다. – Learner

+0

불행히도 GCC가 없습니다. –

+0

@Appu : Comeau (http://www.comeaucomputing.com/tryitout/)는 누락 포함 및'std' 접두사에 대한 코드를 수정 한 후 다음과 같이 말합니다. '비 const에 대한 참조의 초기 값은 반드시 lvalue 여야합니다.' VC가 이것을 허용하는 이유는 VC가 손상 되었기 때문입니다. (그들은 그것을 "기능"이라고 부르지 만 사실은 버그입니다.) – sbi

답변

8

그것은 VC6 컴파일러에서 컴파일하는 데 사용되므로 VS2008은 비표준 확장을 지원합니다. /Za (언어 확장 사용 중지) 플래그로 시도하면 오류가 발생합니다.

+0

Great! 이제 작동합니다. –

+0

'/ Za' 옵션을 지정하면'windows.h '또는 다른 윈도우의 특정 헤더를 포함하는 데 문제가 발생할 수 있습니다. –

+5

경고 수준을 4로 사용하면 더 나은 옵션을 사용할 수 있습니다. – yesraaj

1

VS 2008 및 VS2010 베타 #include와 'using'줄을 추가해야하기 때문에 3 또는 4 씩 꺼짐).

그래서 컴파일러는 꼭 그래야하는 것처럼 엄격하지 않은 것처럼 보입니다.

+0

편집 된 게시물과 내가 사용하고있는 컴파일러를 추가했습니다. –

0

나는 그것이 컴파일러에 달려 있다고 생각한다. g ++ 4.1.2에서 나에게 이것을 제공한다.

In function 'int main()': 
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string' 
compilation terminated due to -Wfatal-errors. 

통화가 최적화되어 있지 않을 수도 있기 때문일 수 있습니다.

+0

mutate() 메서드 내에서 ref 매개 변수를 사용하여 작업을 시도했지만 컴파일되었습니다. –

+0

VC에서 지금 시도했지만 프로젝트 속성에서 확장을 사용하지 않으면 컴파일되고 작동합니다. 당신이 이것을 얻을 때 : 1> main.cpp 1> d : \ all \ projects \ laptop \ 2 \ asd \ asd \ main.cpp (16) : 오류 C2664 : 'mutate': 매개 변수 1을 변환 할 수 없습니다. 'std :: string'에서 'std :: string &'까지 1> const가 아닌 참조는 lvalue에만 바인딩 될 수 있습니다. –

3

이것은 다른 Microsoft 컴파일러의 작동을 모방하는 Microsoft 확장 프로그램입니다. W4 경고를 사용하면 경고가 표시됩니다.

4

그것은 VC++의 사악한 확장입니다./W4로 컴파일하면 컴파일러가 경고합니다. 나는 당신이 Rvalue References: C++0x Features in VC10, Part 2을 읽고있는 것 같아요. 이 기사는 또한 그 문제를 언급했다.

+0

예. 나는 그 기사를 읽고있다. –