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になります。これはコンパイルされるためです。
実際にはclangでうまくコンパイルされたgccバグかもしれません。 – aaronman
'*(t?&a:&b)= X();'は動作しますか? –
@JonathanPotter、はい、これは動作します。 –