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

时间:2017-03-12 14:27:25

标签: c++ c++11 reference const

我对下面这段代码感到有些困惑。 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;
}

2 个答案:

答案 0 :(得分:11)

此行为未定义。

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

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

cout << a << endl;

优化为

cout << '5' << endl;

所以它仍会产生5

答案 1 :(得分:2)

在这种情况下你的C风格演员等同于const_cast。并使用const_cast抛弃原始常量的常量,然后尝试修改它是未定义的行为。您观察到的所有行为都被认为是随机的,并且不需要有任何意义。

如果对象最初是非常量的,可以安全地使用const_cast

#include <iostream>

int main()
{
    int a = 5; // <--- non-constant
    const int &b = a;
    ++const_cast<int&>(b);
    std::cout << a << '\n'; // 6
    std::cout << b << '\n'; // 6
    std::cout << "mem a:" << &a << '\n';
    std::cout << "mem b:" << &b << '\n';
}