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