【问题标题】:Why can I mutate member variable in a const object which is the result of a returning const object function?为什么我可以在作为返回 const 对象函数的结果的 const 对象中改变成员变量?
【发布时间】:2020-04-15 11:54:27
【问题描述】:
struct Dummy {
    int a = 2;
    int b = 6;

    const Dummy share() {
        return Dummy{};
    }
};

在上面的Dummy 结构中有一个名为share() 的成员函数,它返回一个常量Dummy 对象。我除了我不能改变从share() 函数返回的对象。 但是,结果表明该对象是可变的。我在下面粘贴实验代码以获取更多详细信息。

int main() {
    Dummy d1;
    auto d2 = d1.share();
    d2.a = 10;
    // the output is 10.
    std::cout << "d2.a is " << d2.a << std::endl; 
}

那么为什么我可以在这个 const 对象中改变成员变量呢?

【问题讨论】:

  • 因为d2 不是常量?
  • 然后你复制一份^_^
  • @daoliker 当推导类型占位符 auto 时,const 限定符被丢弃。

标签: c++ c++11 constants auto


【解决方案1】:
auto d2 = d1.share();

这里你将d1.share()返回的const对象复制到一个新的非常量变量d2中,然后你修改d2的值,而不是const对象返回的值d1.share()!

你要问的是:

d1.share().a = 5;

这会给您一个错误,您无法更改 const 变量的值。

【讨论】:

    【解决方案2】:

    使用“auto”解析为“Dummy”,而不是“const Dummy”。因此,d2 是(正式)从 share 的结果复制构造的,并且可以对其进行修改。您可以通过说“const auto”来强制 d2 不可变(与 share 的返回类型无关)。

    特别是,“auto”执行的推断会删除 最外层 的 const/volatile 限定符(如果存在),如另一个问题所述:CV - qualifiers of an auto variable

    【讨论】:

    • 可以让auto解析const Dummy吗?
    • 不,因为 auto 的意思是“给我一个可以获取这个表达式结果的普通变量”。要准确复制函数结果的类型,我认为您可以改用“decltype(auto)”。
    • @JavierMartín 请注意,真正的纯右值永远不会被 const 限定,只有类可以。
    • @curiousguy 在某种意义上说“const int&&”没有意义,因为“const int&”也捕获了这样一个值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    相关资源
    最近更新 更多