右值分配的三元表达式不使用移动分配运算符
Ternary expression assigned by rvalue doesn't use move asssignment operator
任何人都知道为什么下面的代码无法编译:
[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 中仍然失败。
问题不在于三元运算符,而在于重载解析最终出现在错误的赋值运算符处。
相关文章:
- 在新表达式中,在内存分配后评估了初始化器
- 如何使用堆栈来验证C 中BNF的表达式或分配
- 如何将新的 lambda 表达式分配给函数对象?
- 表达式不可分配,将 x 和 y 值分配给形状的点
- 表达式无法分配(无需使用 *或 /)的计算器
- 带有数组类型表达式的错误分配
- 分配中的折叠表达式
- lambda表达式分配成员函数指针
- 指针:在 c++ 中不可分配的表达式
- 将值分配给指针时:表达式必须是可修改的lvalue
- 是多个分配表达式(a = 123,b = 456,c = 789)
- 在C++上给定布尔表达式的情况下分配整数值
- 右值分配的三元表达式不使用移动分配运算符
- 动态分配正确对齐的内存:char数组上的新表达式是否合适
- 分配给正则表达式方法的布尔值
- 如何避免稀疏表达式中的内存分配
- Boost表达式sregex分配和捕获组问题
- 内存分配操作符和表达式
- 是分配内存的右值表达式或左值表达式
- 对内存分配和构造函数的调用是否可以与执行"new"表达式所需的其他操作交错?