成员函数模板使用通用引用无法接受左值

4

我一直在尝试使用模板成员函数来设置类内的值。我想使用通用引用,以便可以接受正确类型的任何变体(例如TT&T&&const Tconst T&const T&&)。

然而,似乎我的成员函数只能接受右值引用,而不像一个接受通用引用的自由函数。

template <typename T>
class Foo{
public:
    void memberURef(T&& t){
        val = std::forward<T>(t);
    }
private:
    T val;
};


template <typename T>
void freeURef(T&& t){

}

int main() {
    int lval = 1;
    const int clval = 1;
    freeURef(lval); // fine
    freeURef(clval); // fine

    Foo<int> foo;
    foo.memberURef(2);
    foo.memberURef(lval); //error: cannot bind 'int' lvalue to 'int&&'
    foo.memberURef(clval); //error: no matching function for call to 'Foo<int>::memberURef(const int&)'
    return 0;
}
1个回答

9
在给定的代码中,Foo 被实例化为 Foo<int>。一旦这样做,类模板会被实例化如下所示:
class Foo{
public:
    void memberURef(int&& t){       // Uh oh!
        val = std::forward<int>(t);
    }
private:
    int val;
};

请注意成员函数不再是模板,因此不再接受通用引用,而是右值引用。要创建一个接受通用引用的成员函数,必须修改 Foo 类如下:

template <typename T>
class Foo{
public:
    template <typename L>
    void memberURef(L&& t){
        val = std::forward<L>(t);
    }
private:
    T val;
};

那么,在类模板被实例化后,memberURef仍然是一个函数模板,因此它仍然接受通用引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接