为什么我可以改变 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
变量的值。
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
变量的值。