2012-03-25 4 views
1

Visual Studio (2008) 및 g ++에서 코드를 컴파일하려고합니다.
vs2008에서는 성공했지만 g ++에서는 오류가보고되었습니다.
(추가하는 경우) const,
test(const test &source):a(source.a) {}
g ++ 컴파일이 성공합니다.
test aa = 2;은 임시 개체를 만들고 copy-constructor을 호출합니다.
임시 개체는 비 const 참조에 바인딩 할 수 없습니다.
그래서 vs2008이 컴파일 된 이유는 무엇입니까?약 vs/g ++ 복사 생성자

class test{ 
public: 
    test():a(1) {} 
    test(int num):a(num) {} 
    test(test &source):a(source.a) {} 
private: 
    int a; 
}; 

int main(){ 
    test aa = 2; 
    return 0; 
} 

답변

3

VS에는 불행히도 허용되는 비표준 확장자가 있습니다.

확장 프로그램을 사용하지 않으려면 컴파일러 플래그가 있지만 마지막으로 체크하면 표준 라이브러리를 사용할 수 없게됩니다. 최선의 방법은 경고 수준을 4로 유지하는 것입니다 (이 특정 상황은 경고가 표시되지 않음). 가능한 경우 여러 컴파일러로 컴파일을 확인하십시오.

+0

불행히도 경고는 없습니다./Za는 비표준 동작을 해제하지만/Za는 사용하지 않는 것이 좋습니다. –

+0

@JamesMcNellis : 아, 당신 말이 맞아요.'/ Wall' (기본적으로 어쨌든 사용할 수 없습니다)도 있습니다. 'test aa = test (2); '로 경고하지만, 생성해야하는 것이지만, 그렇지 않은 경우도 있습니다. – GManNickG

+0

@JamesMcNellis : 복사 생성자를 호출하지 않는 대신에'test (int num) '를 호출합니다. – skeu