为什么类类型的右值可以赋值?
在 C 中,通常无法对右值表达式进行赋值。然而,下面的代码片段似乎违反了这种行为:
class Y { public : explicit Y(std::size_t num = 0) {} }; int main() { Y(1) = Y(0); // Assignment to rvalue return 0; }
解释:
与最初的预期相反,此代码编译成功。原因在于成员函数的隐式综合,特别是赋值运算符。根据 C 标准(第 12.8 节 [class.copy],第 18 段),如果未声明赋值运算符或将其标记为已删除,则编译器会合成一个赋值运算符。对于类类型 Y,合成赋值运算符将具有以下签名:
请注意,这些签名在参数之前不包含引用限定符 (&)。因此,合成赋值运算符适用于右值表达式。
此行为允许对通过调用构造函数创建的临时对象进行赋值:Y(1)。
防止 Left -Hand Side Temporary:
为了防止在赋值的左侧创建临时对象,您可以使用一种称为“复制省略”的技术。这涉及到使用引用限定符声明赋值运算符,如以下修改后的代码所示:
class Y { public : explicit Y(std::size_t num = 0); Y& operator= (Y const&) & = default; };
通过此更改,合成赋值运算符将不再适用于右值。
以上是为什么我们可以为 C 中的类类型的右值赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!