2013-06-23 2 views
8

このコードはVS2010ではコンパイルされません。 'A'から 'A &'に変換することはできませんが、標準の12.8p2に従って、A::A(A&)は有効なコピーコンストラクタであり、はA b = foo(a);main()の式の左辺値になります。このコードは、標準の12.8p2に従ってコンパイルしないでください。

#include <iostream> 

class A 
{ 
    public: 

    int x; 
    A(int a) { x = a; std::cout << "Constructor\n"; } 
    A(A& other) { x = other.x; std::cout << "Copy ctor\n"; } 
    A(A&& other) { x = other.x; other.x = 0; std::cout << "Move ctor\n"; } 
}; 

A foo(A a) 
{ 
    return a; 
} 

int main(void) 
{ 
    A a(5); 
    A b = foo(a); 
} 
+5

GCC 4.7.2でコンパイルして正常に動作します。 – interjay

+0

foo()の戻り値をbにコピーするには、move ctorを呼び出しますか? – Belloc

+0

はい、ここをクリックしてください:http://ideone.com/Ykwm2Z – interjay

答えて

2

私は、あなたが話している標準に依存していると言います。

Constructor <- Construction of 'a' in main 
Copy ctor <- Construction of 'a' in foo 
Move ctor <- Move from foo's return value into b 

あなたが指摘するように、FOOに渡さaは左辺値である:C++ 11と仮定すると、その後の私のテイクが、それはOKであるべきで、次のような結果を生成しなければならないということです。ただし、fooからの戻り値はrvalueであるため、pre C++ 11の場合はconst A &コピーコンストラクタ(存在しない)またはC++ 11の場合はmoveコンストラクタを呼び出す必要があります。

関連する問題