在C++ standard你可以阅读那个 (8.5.3.2 pag.202)
"A reference cannot be changed to refer to another object after initialization."
但是下面的代码呢
#include <iostream>
#include <functional>
int main(int argc, const char * argv[])
{
int i = 1;
int &j = i;
j = 2; // Ok, now i == 2
int k = 3;
j = std::ref(k);
std::cout << "j = " << j << ", i = " << i << std::endl;
return 0;
}
产生这个输出
j = 3, i = 3
真的错了吗?是编译器的“特性”还是 C++ 语言的“特性”?我在 mac(LLVM 5.1)和 windows(VS2010)上编译了这段代码的片段。
最佳答案
线
j = std::ref(k);
效果完全一样
j = k
即引用 std::ref(k)
在赋值给 k
之前被隐式解除引用,k
也赋值给 i
。所以难怪你看到的行为。作为证明,只需将您的代码更改为
int i = 1;
int &j = i;
j = 2; // Ok, now i == 2
int k = 3;
j = std::ref(k);
std::cout << "j = " << j << ", i = " << i << std::endl;
k = 5;
std::cout << "j = " << j << ", i = " << i << std::endl;
那么输出就是
j = 3, i = 3
j = 3, i = 3
这表明 j
不是对 k
的引用。更改 k
不会更改 j
。
关于c++ - 初始化后更改变量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22621380/