为什么C ++ 0x中的ref不能按预期运行?

时间:2010-11-30 07:58:21

标签: c++11

我很抱歉我以前的错误措辞。所以我把这个问题改写如下:

下面最简单的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的确切语义?

1 个答案:

答案 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的版本也没有,他们只是说这个类“通常允许函数模板处理未经修改的引用”。猜猜这不是其中之一。