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


struct Dummy {
int a = 2;
int b = 6;
const Dummy share() {
return Dummy{};
}
};

有一个名为share()的成员函数,它在上面的Dummy结构中返回一个 constDummy对象。我除了我不能改变从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 是从共享结果(形式上(复制构造的,并且可以修改。您可以通过说"const auto"来强制 d2 不可变(独立于共享的返回类型(。

特别是,由"auto"执行的推理会删除常量/易失性限定符的最层(如果它们存在(,如另一个问题所述: CV - 自动变量的限定符

auto d2 = d1.share();

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

你要问的是:

d1.share().a = 5;

这将为您提供一个错误,指出您无法更改const变量的值。

最新更新