在转换为非const之后const引用的行为

dan*_*win 4 c++ const reference c++11

我对下面这段代码感到有些困惑.b如何仍然引用a但具有不同的值?

#include <iostream>
using namespace std;
int main()
{
    const int a = 5;
    const int &b = a;
    ++(int&)b;
    cout << a << endl;//returns 5
    cout << b << endl;//returns 6
    cout << "mem a:" << &a << endl; //returns 0x61ff18
    cout << "mem b:" << &b << endl; //returns 0x61ff18
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 11

此行为未定义.

你可以合法地从一个非常数对象的常量引用中抛出常量; 但是,从引用真实的引用中转换const-ness const会导致未定义的行为.

在这种情况下,似乎编译器创建了一个要存储的内存位置5,以便为您提供一个可以作为引用的位置b,而变量a本身则被优化为一个常量.您的代码非法修改通过引用的位置b,产生6,而线

cout << a << endl;
Run Code Online (Sandbox Code Playgroud)

被优化成

cout << '5' << endl;
Run Code Online (Sandbox Code Playgroud)

所以它仍然产生一个5.

  • @danwin:C++ ISO标准未定义该行为.这并不意味着无法推断编译器产生的行为; 它只是意味着您无法可靠地使用C++规则来推理它. (3认同)