c ++当const不是一个明确的?

Sha*_*adi 0 c++ const declaration const-cast

我搜索了互联网和StackOverflow关于const_cast <>及其引起的混乱,我找到了有用的东西,但是我还有一个问题.

考虑到这段代码,

#include <iostream>
using namespace std;

int main(void)
{
    const int a = 1;
    int *p = const_cast<int*>(&a);
    *p = 2;

    cout << "value a="<< a << endl;
    cout << "value *p=" <<*p << endl;
    cout << "address a=" <<&a << endl;
    cout << "address p=" <<p << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

值a = 1
值*p = 2
地址a = 0x69fef8
地址p = 0x69fef8

我发现这样的代码可能导致未定义的行为.(例如,编译器可能会将所有a's 替换为's以1进行优化,因此强制转换没有意义)

我也发现了这句话:

如果抛弃已显式声明为const的对象的常量,并尝试修改它,则结果是未定义的.

但是,如果丢弃未明确声明为const的对象的常量,则可以安全地修改它.

还有这个:

请注意,C++提供const_cast了删除或添加常量的变量.但是,在删除constness时,它应该用于从引用/指针中删除constness,以指向原本不是常量的东西.

现在,考虑以下代码的以下修改:

int b = 1;
const int a = b;
Run Code Online (Sandbox Code Playgroud)

输出是:

值a = 2
值*p = 2
地址a = 0x69fef4
地址p = 0x69fef4

我明白那个:

ain int a = 1是在编译时处理的常量表达式.
ain int a = b不是,它只能在运行时处理.

作为描述在这里.

我的问题:

const声明何时显式,何时不显式?它怎么可能最初是非const?

Oli*_*rth 5

一个简单的反它有效的:

void foo(const int *a) {            // Pointer-to-const here
    int *p = const_cast<int*>(a);
    *p = 2;
}

int main() {
    int a = 1;                      // But underlying object is not const
    foo(&a);
}
Run Code Online (Sandbox Code Playgroud)