加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 具有通用引用的成员函数模板不接受左值

发布时间:2020-12-16 09:56:36 所属栏目:百科 来源:网络整理
导读:我一直在尝试使用模板成员函数在我的类中设置一个值.我想使用通用参考,以便我可以接受任何正确类型的变体(例如T,T,T,const T,const T,const T) 但是,似乎我的成员函数只接受rvalues,而不像接受通用引用的自由函数. template typename Tclass Foo{public: voi
我一直在尝试使用模板成员函数在我的类中设置一个值.我想使用通用参考,以便我可以接受任何正确类型的变体(例如T,T&,T&&,const T,const T&,const T&&)

但是,似乎我的成员函数只接受rvalues,而不像接受通用引用的自由函数.

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;
}

解决方法

在给出的代码中,Foo被实例化为Foo< int>.一旦发生这种情况,就会实例化类模板,如下所示:

class Foo{
public:
    void memberURef(int&& t){       // Uh oh!
        val = std::forward<int>(t);
    }
private:
    int val;
};

注意成员函数不再是模板,因此不再接受通用引用,而是接受rvalue引用.为了使成员函数接受通用引用,需要修改Foo类,如下所示:

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

这样,在实例化类模板之后,memberURef仍然是一个函数模板,因此它仍然接受通用引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读