我很抱歉我以前的错误措辞。所以我把这个问题改写如下:
下面最简单的C ++ 0x代码无效:
#include <functional>
template<class T_>
void f(T_ obj)
{
Obj++; // OK that is as expected.
static_cast<int&>(obj) = 2; // Though ugly, this is still OK.
obj = 2; // However, this line will generate a compiler error
}
int main()
{
int i = 1;
f(std::tr1::ref(i));
}
谁能告诉我ref的确切语义?
答案 0 :(得分:1)
错误的原因是没有合适的赋值运算符可以应用。唯一的候选人就是:
reference_wrapper& operator=(const reference_wrapper<T>& x);
reference_wrapper
在隐式转换运算符的帮助下充当参考:
operator T& () const;
但是,在赋值运算符的左侧不会发生隐式转换。
如果您希望此模板支持reference_wrapper
,也许您可以通过以下方式解决:
#include <functional>
#include <iostream>
template <class T>
T& get(T& value)
{
return value;
}
template <class T>
T& get(std::reference_wrapper<T>& w)
{
return w.get();
}
template<class T_>
void f(T_ obj)
{
//obj = 2;
get(obj) = 2;
}
int main()
{
int i = 1;
f(std::ref(i));
std::cout << i << '\n';
f(3.14); //at the same time, we want this also to work
}
至于为什么reference_wrapper
没有存储类型的赋值运算符,不确定。 Boost的版本也没有,他们只是说这个类“通常允许函数模板处理未经修改的引用”。猜猜这不是其中之一。