11

任何人都知道为什么以下代码无法编译:

[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()右值,所以在这种情况下应该调用移动赋值运算符吗?C++11 标准中的哪一部分讨论了右值分配的 case 三元表达式?

注意:在这种情况下,三元表达式是左值,因为如果我将 更改= delete= default,它会编译。

4

1 回答 1

2

这是编译器中的一个错误,请参阅Bogus 重载解析 for assignment operator in assignment to a conditional,它在 gcc 4.9 中仍然失败。

问题不在于三元运算符,而是重载决议最终出现在错误的赋值运算符上。

于 2013-10-17T07:54:19.473 回答