【发布时间】:2016-10-09 01:53:02
【问题描述】:
据我了解,以下代码是根据 c++ 标准(特别是第 7.1.5.1.4 [dcl.type.cv]/4 节)未定义的行为。
#include <iostream>
struct F;
F* g;
struct F {
F() : val(5)
{
g = this;
}
int val;
};
const F f;
int main() {
g->val = 8;
std::cout << f.val << std::endl;
}
但是,我尝试过的每个编译器和优化设置都会打印“8”。
问题:这种类型的“隐式 const_cast”是否有会出现意外结果的示例?
我希望有一些像结果一样壮观的东西
#include <iostream>
int main() {
for (int i = 0; i <=4; ++i)
std::cout << i * 1000000000 << std::endl;
}
开启,例如,带有 -O2 的 gcc 4.8.5
EDIT:标准中的相关部分
7.1.5.1.4:除了可以修改任何声明为 mutable (7.1.1) 的类成员外,任何在 const 对象的生命周期内修改它的尝试 (3.8) 导致未定义的行为。
回复建议重复的评论;它不是重复的,因为我要求的是出现“意外”结果的示例。
【问题讨论】:
-
这是一个非常狡猾的设置 - 非常好。
-
我确实喜欢底部那个 sn-p 的症状。零,一,二,放开海妖!
-
尝试定义未定义行为的价值是什么?
-
@Kaz 不幸的是,破坏以前有效代码的“修复”违反了 C++ 的原则。即便如此,即使按照今天的标准,C++ 允许这种“黑客攻击”这一事实也是该语言的卖点之一,因为它允许一些人按时交付他们的项目,无论你最后遇到什么问题分钟,即使以可维护性为代价。不错的题外话,不过