任何人都知道为什么以下代码无法编译:
[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标准中的哪一节讨论了由rvalue分配的案例三元表达式?
注意:在这种情况下,三元表达式是左值,因为如果我将= delete
更改为= default
,它就会编译。
答案 0 :(得分:2)
这是编译器中的一个错误,请参阅Bogus overload resolution for the assignment operator in assignment to a conditional,它仍然在gcc 4.9中失败。
问题不在于三元运算符,而是在错误的赋值运算符处结束了重载决策。