为什么我可以改变 const 对象中的成员变量,这是返回 const 对象函数的结果?

Why can I mutate member variable in a const object which is the result of a returning const object function?

struct Dummy {
    int a = 2;
    int b = 6;

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

上面的Dummy结构中有一个成员函数share(),它returns一个const 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 对象中的成员变量?

使用 "auto" 解析为 "Dummy",而不是 "const Dummy"。因此,d2 是(正式)从 share 的结果复制构造的,并且可以修改。您可以通过说 "const auto".

强制 d2 不可变(独立于 return 类型的共享)

特别是,"auto" 执行的推理会删除 最外层 层的 const/volatile 限定符(如果存在),如另一个问题所述:

auto d2 = d1.share();

在这里,您将 d1.share() returns 的 const 对象复制到一个新的非常量变量 d2 中,然后修改 [=14] 的值=],而不是 d1.share()!

返回的 const 对象的值

你问的是这个:

d1.share().a = 5;

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