const_cast的静态const成员

mat*_*ati 8 c++ static const member const-cast

以下代码使用GCC(4.2-4.6)和Clang(2.1)编译得很好,但是当我运行可执行文件时,它给出了"总线错误:10".我不明白原因.

#include <iostream>

struct A
{
  static int const v;
  A() { ++*const_cast<int *>(&A::v); }
};

int const A::v = 0;

int main(int argc, char * argv[])
{
  A a, b, c;
  std::cout << a.v << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

pmr*_*pmr 12

我认为相关的引用是:

N3242的第7.1.6.1(4)段:

除了可以修改任何声明为mutable的类成员之外,任何在其生命周期内修改const对象的尝试都会导致未定义的行为.

这些例子说明了这一点const_cast.正如James所指出的那样:引用可以在C++ 03标准的§7.1.5中找到.

一点点阐述:该语言规则允许编译器在声明某些内容时使用只读内存(如果它在目标体系结构上可用)const.如果没有这个规则const- 永远不会出现任何后果,而且使用它只会是开发人员纪律的问题.它的方式至少可以告诉人们他们正在调用UB,这通常是一个很好的威慑.它const_cast本身具有较小的相关性,因为无论你如何欺骗编译器让你操纵一个const对象.


小智 7

5.2.11.7:

根据对象的类型,通过指针,左值或指向数据成员的指针的写入操作可以产生未定义的行为(7.1.5.1)

在您的情况下,您正在尝试修改只读段中的数据.