2013-10-13 19 views
11

誰もが知っている移動asssignment演算子を使用していません:三項式は、次のコードはコンパイルされませんなぜ

[hidden]$ g++ -v |& tail -n 1 
gcc version 4.8.1 20130603 (Red Hat 4.8.1-1) (GCC) 
[hidden]$ cat c.cpp 
struct X { 
    X() = default; 
    X(const X&) = default; 
    X(X&&) = default; 
    X& operator=(const X&) = delete; 
    X& operator=(X&&) = default; 
}; 

void f(bool t) { 
    X a, b; 
    (t ? a : b) = X(); 
} 

[hidden]$ g++ -std=c++11 -c c.cpp 
c.cpp: In function ‘void f(bool)’: 
c.cpp:11:15: error: use of deleted function ‘X& X::operator=(const X&)’ 
    (t ? a : b) = X(); 
      ^
c.cpp:5:6: error: declared here 
    X& operator=(const X&) = delete; 
    ^
c.cpp:11:15: error: use of deleted function ‘X& X::operator=(const X&)’ 
    (t ? a : b) = X(); 
      ^
c.cpp:5:6: error: declared here 
    X& operator=(const X&) = delete; 
    ^

X()右辺値は非常に移動代入演算子は、この場合に呼ばれるべきことではないです? rvalueで指定された大文字の三項式についてC++ 11標準のどのセクションで話していますか?

注:この場合、= delete= defaultに変更すると、3値表現がlvalueになります。これはコンパイルされるためです。

+7

実際にはclangでうまくコンパイルされたgccバグかもしれません。 – aaronman

+0

'*(t?&a:&b)= X();'は動作しますか? –

+0

@JonathanPotter、はい、これは動作します。 –

答えて

関連する問題