gpt4 book ai didi

c++ - 引用类型的数据成员提供 "loophole"围绕 const 正确性

转载 作者:IT老高 更新时间:2023-10-28 21:58:30 36 4
gpt4 key购买 nike

我最近偶然发现了以下关于 const 正确性的“漏洞”:

struct Inner {
int field = 0;
void Modify() {
field++;
}
};

struct Outer {
Inner inner;
};

class MyClass {
public:
Outer outer;
Inner& inner; // refers to outer.inner, for convenience

MyClass() : inner(outer.inner) {}

void ConstMethod() const {
inner.Modify(); // oops; compiles
}
};

似乎还有可能利用这个漏洞来修改声明为 const 的对象,我认为这是未定义的行为:

int main() {
const MyClass myclass;
std::cout << myclass.outer.inner.field << "\n"; // prints 0
myclass.ConstMethod();
std::cout << myclass.outer.inner.field << "\n"; // prints 1
}

这让我很害怕,因为我似乎刚刚在一个不使用 const_cast 的程序中调用了与 const 正确性相关的未定义行为,或者使用 C 风格的强制转换来抛弃 constness。

所以,我的问题是:

  • 我是否正确地说上述程序具有未定义的行为?
  • 如果是这样,这是语言错误吗?上面的程序中是否有一行可以说不应该(可以合理地不编译)?
  • 在实践中是否应遵循一些准则以避免此类未定义行为?

最佳答案

Any modifications const 对象是未定义的行为,而代码片段确实做到了。

程序不是格式错误的(这将导致编译错误),因为在初始化 inner 时,cv-qualifiers 还没有生效。

从编译器的角度来看,发出警告需要它分析通向 inner.Modify() 的所有代码路径并证明 inner 必须 指的是一个 const 对象,这在一般情况下是不可能的。

最好的建议可能是没有内部指针/引用,这无论如何都是邪恶的。

关于c++ - 引用类型的数据成员提供 "loophole"围绕 const 正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448245/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com