首页 > 解决方案 > 模板函数不使用右值引用实例化/接收调用

问题描述

如标题中所述,当我显式实例化一个函数的左值和右值版本时,它可以工作,如果我尝试使用模板这样做,它就不会。海合会 7.4。我错过了什么?

class Test {};

class Explicit {
public:
    void func (const Test &t) {
        cout << std::is_rvalue_reference<const Test&>::value << endl;
    }

    void func (Test &&t) {
        cout << std::is_rvalue_reference<Test&&>::value << endl;
    }
};

class Implicit {
public:
    template<class T>
    void func (T t) {
        cout << std::is_rvalue_reference<T>::value << endl;
    }
};

// explicitly instantiate two versions of the function
template void Implicit::func<const Test &> (const Test &);
template void Implicit::func<Test &&> (Test &&);

int main () {
    Explicit e = Explicit ();
    Implicit i = Implicit ();
    Test t;

    e.func (t);                 // goes to func (const Test&), as expected
    e.func (Test ());           // goes to func (Test&&), as expected
    e.func ((Test &&) Test ()); // goes to func (Test&&), as expected

    i.func (t);                 // goes to func (const Test&), as expected
    i.func (Test ());           // goes to func (const Test&), not as expected!
    i.func ((Test &&) Test ()); // goes to func (const Test&), not as expected!
}

标签: c++

解决方案


您的显式实例化是无用的(在拆分标头和 cpp 时可能很有用):

// explicitly instantiate two versions of the functions
template void Implicit::func<const Test &> (const Test &);
template void Implicit::func<Test &&> (Test &&);

对于您的“隐式”,您实际上得到了:

i.func (t);                 // goes to func(Test)
i.func (Test ());           // goes to func(Test)
i.func ((Test &&) Test ()); // goes to func(Test)

作为

template<class T> void func (T t)

不推断参考。

然后你打电话void Implicit::func<Test>


推荐阅读