gpt4 book ai didi

c++ - C++ 中 *const* 变量的 const_cast 之后的地址

转载 作者:行者123 更新时间:2023-11-30 03:57:02 31 4
gpt4 key购买 nike

我知道下面应该是未定义的行为因为原始变量是const。然而,这怎么可能,&x&rx 这两个地址是相同的,但值他们打印的(我没有说保留,因为它根本不可能),不是。谢谢!

const int x=10;
int& rx = const_cast<int&>(x);
rx++;
cout << x << " and " << rx << endl;
cout << "is &x == &xr: " << (&x==&rx) << endl;

G++ 4.9 的输出是

10 and 11
is &x == &xr: 1

最佳答案

编译器(好吧,上周的 clang++ 3.7.0)确实优化了代码的“意图”,不管它是否合法:

    movl    $_ZSt4cout, %edi
movl $10, %esi
callq _ZNSolsEi
movq %rax, %rbx
movl $.L.str, %esi
movl $5, %edx
movq %rbx, %rdi
callq _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
movl $11, %esi
movq %rbx, %rdi
callq _ZNSolsEi

一如既往,值得注意的是,未定义行为的行为确实涵盖了“做你认为它会做的事”,以及“没有做你认为它会做的事”,这当然适用于此。

const_cast 最初是 const 的值是未定义的行为,此时您已经放弃了编译器的“理智行为”的所有权利。现在发生的是编译器作者认为正确的事情——如果这意味着该值实际上被放置在只读内存位中,那么您的代码将无法成功更新该值。但在这种情况下,它只是将 x 优化为常量 10,而 rx 变为 11 - 因为您实际上并没有用 x< “做”任何其他事情rx,按照编译器标准,这是“好的”。

关于c++ - C++ 中 *const* 变量的 const_cast 之后的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203635/

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