gpt4 book ai didi

c++ - const_cast 未定义行为的重要示例

转载 作者:IT老高 更新时间:2023-10-28 23:01:39 25 4
gpt4 key购买 nike

据我了解,以下代码是根据 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: Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.

回复建议重复的评论;它不是重复的,因为我要的是出现“意外”结果的示例。

最佳答案

没有那么壮观:

f.h(省略守卫):

struct F;
extern F* g;

struct F {
F() : val(5)
{
g = this;
}
int val;
};

extern const F f;
void h();

TU1:

#include "f.h"
// definitions
F* g;
const F f;
void h() {}

TU2:

#include "f.h"
#include <iostream>
int main() {
h(); // ensure that globals have been initialized
int val = f.val;
g->val = 8;
std::cout << (f.val == val) << '\n';
}

使用 g++ -O2 编译时打印 1,使用 -O0 编译时打印 0

关于c++ - const_cast 未定义行为的重要示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37708544/

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