5

考虑以下代码:

#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&。

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

为什么?

4

1 回答 1

3

reference_wrapper<T>有一个到 的隐式转换运算符T &,因此它将被转换到T &任何T &比 a 更好匹配的地方reference_wrapper<T>

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

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

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

#include <functional>
#include <iostream>

int main() {
    int i = 1, j = 2;
    std::ref(i) = j;
    std::cout << i << '\n';                 // prints '1'
}
于 2012-11-22T18:13:35.197 回答