转换的奇怪问题

时间:2010-11-22 12:14:23

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

在下面的代码中:

template<class Key, class Value>
    class Pair
    {
    private:
        std::pair<Key,Value> body_;
    public:
        //No cpy ctor - this generated by compiler is OK
        Pair(Key&& key,Value&& value)
        {
            body_.first = key;
            body_.second = value;
        }

        Pair(Pair<Key,Value>&& tmpPattern)
        {
            body_.swap(tmpPattern.body_);
        }

        Pair& operator=(Pair<Key,Value> tmpPattern)
        {
            body_.swap(tmpPattern.body_);
            return *this;
        }

                };

    template<class Key, class Value>
    Pair<Key,Value> MakePair(Key&& key, Value&& value)
    {
        return Pair<Key,Value>(key,value);
    }

对于一些古怪的原因,当我尝试运行MakePair时出现错误,为什么?天知道......

int main(int argc, char** argv)
{
auto tmp = MakePair(1, 2);
}

这是这个错误:
错误错误C2665:Pair :: Pair':3个重载中没有一个可以转换所有参数类型

我只是不明白要进行哪些转换?

2 个答案:

答案 0 :(得分:0)

您需要将值传递给MakePair,而不是类型。试试这个:

int a = 1;
int b = 2;
auto tmp = MakePair( a, b ); // creates a Pair<int,int> with the values of a and b

答案 1 :(得分:0)

return Pair<Key,Value>(std::forward<Key>(key),std::forward<Value>(value));

虽然我不确定为什么右值转发不是隐含的。

编辑:哦,我想我明白了。这样,您仍然可以将rvalue引用传递给具有值的函数。