当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《具有通用引用的成员函数模板将不接受左值》经验,为你挑选了1个好方法。

我一直在尝试使用模板成员函数在我的类中设置一个值.我想用一个通用的参考,这样我可以接受的正确类型的任何变体(例如T,T&,T&&,const T,const T&,const T&&)

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

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


template 
void freeURef(T&& t){

}

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

    Foo 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::memberURef(const int&)'
    return 0;
}

Jason Powers.. 7

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

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

注意成员函数不再是模板,因此不再接受通用引用,而是接受rvalue引用.为了创建一个接受通用引用的成员函数,Foo需要按如下方式修改类:

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

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



1> Jason Powers..:

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

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

注意成员函数不再是模板,因此不再接受通用引用,而是接受rvalue引用.为了创建一个接受通用引用的成员函数,Foo需要按如下方式修改类:

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

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

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有