c++ - 初始化后更改变量引用

标签 c++ c++11 standards

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/

相关文章:

c++ - 宏 C++ 问题 __VA_ARGS__

C++ strcpy(Struct.Property, "VALUE") 在 C# 中使用?

c++ - 包括 "winmain.h"与 <windows.h>

c++ - 智能指针作为条件 : are if (p) and if (p. get()) 等效?

PowerShell ErrorRecord.CategoryInfo.Activity (CategoryActivity)

c++ - 在 Windows 上链接可执行文件的正确方法是什么?

c++ - 对 openmp C++ 中的一些嵌套进行并行化

c++ - std::unordered_multiset 插入的复杂性

java - 从 Java 的 System.in 读取输入的替代方法

php 从空值创建默认对象?