C++ 11使用指针导致SIGSEGV修改initializer_list中的元素,为什么?

Hin*_*sum 1 c++ segmentation-fault const-cast initializer-list c++11

我使用const_cast来修改initializer_list中的元素,如下所示:

#include <initializer_list>
int main()
{
    auto a1={1,2,3};
    auto a2=a1;//copy or reference?
    for(auto& e:a1)
    {
        int*p=const_cast<int*>(&e);
        ++(*p);
    }
    for(auto& e:a2)
        cout<<e;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当做++(*p)时,这个g ++ 4.9.2编译的程序会抛出SIGSEGV.这个问题不会发生在VC中.

为什么,我的程序是否有任何不安全的操作?请帮忙,谢谢.

Yak*_*ont 5

修改最初声明的数据是未定义的行为const,并且始终是初始化列表的内容const.

在这种情况下,似乎列表的内容存储在只读页面或某些页面中,并且您收到运行时错误.你很幸运:未定义的行为可能会发生任何事情.

写入const引起的未定义行为的另一个典型示例是,当您在一行上修改某些内容时,在下一行中您读取它并且修改不会显示.发生这种情况是因为编译器可以假设任何const声明的(未引用的)数据不会改变,因此它可以优化其代码以假定初始值是它始终具有的值.

该编译器实际上做其他的可能性是编译器注意到你在分支上做不确定的行为,理由是该分支不能在逻辑上考虑,得出的是进入分支的条件必须是其他设置,完全消除了分公司(和/或进入一个分支,其前提条件由上述逻辑证明).未定义的行为可以节省时间.

您的硬盘驱动器可能被格式化,计算机可能会爆炸,它会将您的网络历史记录通过电子邮件发送给您的父母:编译器可以随时使代码执行任何操作,无论是出于何种原因.

不要做未定义的行为.