gpt4 book ai didi

c++ - 类模板与函数模板中的右值引用

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:26 24 4
gpt4 key购买 nike

#include <iostream>

template <typename T>
class test
{
public:
test(T&& t)
{
}
};

template <typename T>
void succeed(T&& t)
{
}

int main()
{
int i = 1;
test<int> t(i); // failed to compile
succeed(i); // OK
return 0;
}

来自 GCC 5.2 的错误: main.cpp:在函数“int main()”中: main.cpp:20:18: 错误:无法将“int”左值绑定(bind)到“int&&” 测试 t(i); ^ main.cpp:7:5: 注意:正在初始化“test::test(T&&) [with T = int]”的参数 1 测试(T&& t) ^~~~

有人可以解释为什么类模板无法编译但函数模板可以吗?谢谢。

最佳答案

succeed 中,T&& t 是一个转发引用,而不是一个右值引用。但在 test 中,它是一个右值引用。

仅当参数为T&& 时才会发生转发引用,并且T 是该函数的模板参数。在您的代码中,T 是封闭类的模板参数,因此它不算作转发引用。

转发引用可以绑定(bind)到左值和右值。

在起草 C++11 期间,建议使用与右值引用不同的语法来转发引用(而不是对两者都使用 T&& t);然而,委员会最终决定了目前的行为。

有关模板参数推导的更详细描述,包括更精确的说明 T&& 何时成为转发引用,see here -- 搜索术语“转发引用”以查找转发引用的特殊规则。

关于c++ - 类模板与函数模板中的右值引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785755/

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