为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
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{};
}
};
有一个名为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
变量的值。
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C++,如何使用常量对象和非常量对象进行比较?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- C++ 对非常量对象的常量引用和对非常量对象的非常量引用之间的区别
- 算法不适用于非常量对象的const_iterator
- 为什么MSVC14允许声明指向动态未初始化常量对象的指针
- C++中的常量对象或私有/常量数据成员(变量)?
- 将值从指针复制到常量对象参数
- 指向静态常量对象的共享指针?
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>
- 对非常量对象的常量引用
- 为什么 std::move 适用于常量对象
- 如何最好地初始化和存储常量对象
- 构造常量对象与引用常量对象
- 指向从未变为常量的常量对象的C++指针
- 具有常量对象的代码大小
- 如何使构造函数接受一个非常量对象
- 我真的需要为常量对象实现用户提供的构造函数吗?