gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:12:17 24 4
gpt4 key购买 nike

我一直在尝试使用模板成员函数在我的类中设置一个值。我想使用通用引用,以便我可以接受正确类型的任何变体(例如 TT&T&&常量 T, 常量 T&, 常量 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;
}

最佳答案

在给出的代码中,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在类模板被实例化之后仍然是一个函数模板,因此它仍然接受一个通用引用。

关于c++ - 具有通用引用的成员函数模板不接受左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28643645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com