我能问一下为什么下面的代码可以编译而没有任何错误吗?
struct Test {
int num;
};
int main() {
(Test){.num = 10} = (Test){.num = 20};
return 0;
}(Test){.num = 10}和(Test){.num = 20}是rvalue,不可能将rvalue分配给另一个rvalue。cpp如何认为语句是有效的?
PS:代码是使用C++11标准编译的
发布于 2020-10-03 02:43:14
默认情况下,这正是在c++中指定特殊成员函数的方式。例如,Test具有一个综合的特殊成员函数:
Test& operator=(Test const &) = default; // if you write it out它可以在lvalue和rvalue上调用。
如果不允许向rvalue分配赋值,则必须自定义类的行为:
struct Test {
int num;
Test& operator=(Test const &) & = default; // lvalues: ok
Test& operator=(Test const &) && = delete; // rvalues: error
};下面是演示中的c++20,就像示例中的代码一样,但同样的原则也适用于c++11。
请注意,对于内置类型,这种行为更明智,因此您不能这样做:
42 = 5;
3 + 3 = 6; 也没有办法让它编译。
https://stackoverflow.com/questions/64180170
复制相似问题