2012-03-25 1 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

関連する問題