右值分配的三元表达式不使用移动分配运算符

Ternary expression assigned by rvalue doesn't use move asssignment operator

本文关键字:分配 表达式 移动 运算符 三元      更新时间:2023-10-16

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

[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 标准中的哪一部分谈到了右值分配的大小写三元表达式?

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

这是编译器中的一个错误,请参阅赋值到条件运算符的虚假重载解析,它在 gcc 4.9 中仍然失败。

问题不在于三元运算符,而在于重载解析最终出现在错误的赋值运算符处。