何时将std :: reference_wrapper转换为T&?

时间:2012-11-22 17:00:44

标签: c++ c++11 reference-wrapper

请考虑以下代码:

#include <iostream>
#include <functional>

using namespace std;

template<class T>
void fun(T t) 
{ 
    t+=8;
}


int main()
{
    int i = 0;
    fun(ref(i));
    cout << i << endl;
}

此代码打印“8”。我假设fun()中的t自动转换为int&amp;。

但如果我用t+=8替换t=8,程序将无法编译。

为什么?

1 个答案:

答案 0 :(得分:3)

reference_wrapper<T>有一个隐式转化运算符T &,因此只要T &T &匹配得更好,它就会转换为reference_wrapper<T>

在扩充赋值表达式中,唯一可行的运算符是int &operator+=(int &, int),因此提取int &

在赋值表达式中,成员运算符reference_wrapper<int>::operator=(const reference_wrapper<int> &)也可用,因此首选成员运算符;然后编译器尝试从常量8构造一个引用包装器,它会失败。赋值运算符具有重新绑定的效果,这对于像tie这样的工具按预期工作是必需的。

这意味着引用包装器更接近Python等语言中的引用而不是C ++引用:

#include <functional>
#include <iostream>

int main() {
    int i = 1, j = 2;
    std::ref(i) = j;
    std::cout << i << '\n';                 // prints '1'
}