【问题标题】:Behavior of self-assignment with const ref parameter使用 const ref 参数的自赋值行为
【发布时间】:2018-03-07 07:35:58
【问题描述】:

我偶然发现了一些非常古老的代码,它有一个定义了复制赋值运算符的类,该运算符将其参数作为 const 引用,但也不检查自赋值,所以本质上是:

struct A
{
    int q;
    A(): q(3) {}

    A& operator=(const A& a)
    {
        q = a.q;
        return *this;
    }
};

A 的实例被分配给它自己时,这个赋值运算符的行为是什么?我认为这会导致问题,因为它“破坏”了参数的常量性,任何编译器都可以假设参数没有更改并基于此进行优化。

但是,clang 和 gcc 都没有发出警告,程序运行良好。如果我在赋值运算符中的赋值之前将 q 的值显式更改为 4,这也有效。

【问题讨论】:

  • 值得注意的是,确实,在这种情况下,参数没有改变。

标签: c++ c++98


【解决方案1】:

将对象绑定到 const 引用并不会突然将其变为 const。那里的const只表示该函数不能通过a修改参数。这并不意味着被引用的对象必须是 const 本身。

由于*thisa 可以合法地为同一个对象起别名,因此这样的代码没有风险。编译器不能对别名做出疯狂的假设。

只有当赋值运算符没有运行完成或释放资源然后尝试从“其他”复制时,对象状态可能会以某种方式损坏时,自赋值才是一个问题。您的示例没有发生这种情况的风险。然而,一般来说,应该注意可能引发的异常和资源的所有权。

【讨论】:

    猜你喜欢
    • 2013-05-10
    • 2015-10-02
    • 2014-07-25
    • 2013-10-25
    • 1970-01-01
    • 2018-01-20
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多