考虑以下代码:
#include <iostream>
#include <functional>
int xx = 7;
template<class T>
void f1(T arg)
{
arg += xx;
}
template<class T>
void f2(T arg)
{
arg = xx;
}
int main()
{
int j;
j=100;
f1(std::ref(j));
std::cout << j << std::endl;
j=100;
f2(std::ref(j));
std::cout << j << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
执行时,此代码输出
107
100
Run Code Online (Sandbox Code Playgroud)
我原以为第二个值是7而不是100.
我错过了什么?
Ric*_*ges 57
一个小修改f2
提供线索:
template<class T>
void f2(T arg)
{
arg.get() = xx;
}
Run Code Online (Sandbox Code Playgroud)
这现在符合您的期望.
发生这种情况是因为std::ref
返回一个std::reference_wrapper<>
对象.赋值运算符重新绑定包装器.(见http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/operator%3D)
它不会对包装引用进行赋值.
在f1
情况下,所有工作如你预期,因为std::reference_wrapper<T>
提供了一个转换运营商T&
,这将绑定到的隐性右侧int
内隐operator+
.
Moh*_*ain 10
arg = xx;
本地arg
现在指(读作绑定)xx
.(并没有更多指j
)
arg += xx;
operator T& ()
应用隐式来匹配参数,operator +=
因此对引用的对象执行加法,即j
.
所以观察到的行为是正确的.
归档时间: |
|
查看次数: |
2513 次 |
最近记录: |