首页 > 后端开发 > C++ > 为什么我们可以为 C 中的类类型的右值赋值?

为什么我们可以为 C 中的类类型的右值赋值?

Patricia Arquette
发布: 2024-10-29 13:58:02
原创
949 人浏览过

 Why Can We Assign to Rvalues of Class Type in C  ?

为什么类类型的右值可以赋值?

在 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& Y::operator=(Y const&)
  • Y& Y::operator=(Y&)

请注意,这些签名在参数之前不包含引用限定符 (&)。因此,合成赋值运算符适用于右值表达式。

此行为允许对通过调用构造函数创建的临时对象进行赋值:Y(1)。

防止 Left -Hand Side Temporary:

为了防止在赋值的左侧创建临时对象,您可以使用一种称为“复制省略”的技术。这涉及到使用引用限定符声明赋值运算符,如以下修改后的代码所示:

class Y {
public :
    explicit Y(std::size_t num = 0);
    Y& operator= (Y const&) & = default;
};
登录后复制

通过此更改,合成赋值运算符将不再适用于右值。

以上是为什么我们可以为 C 中的类类型的右值赋值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板