gpt4 book ai didi

c++ - 类型未推断为右值引用 : why not?

转载 作者:太空狗 更新时间:2023-10-29 23:43:45 24 4
gpt4 key购买 nike

请考虑以下代码:

class CMyClass {};

template<class T>
void func(T&& param) {
if (std::is_same<CMyClass, std::decay<T>::type>::value)
std::cout << "param is a CMyClass\n";
if (std::is_same<T, CMyClass&>::value)
std::cout << "param is a CMyClass reference\n";
else if (std::is_same<T, CMyClass&&>::value)
std::cout << "param is a CMyClass r-value reference\n";
else if (std::is_same<T, const CMyClass&>::value)
std::cout << "param is a const CMyClass reference\n";
else if (std::is_same<T, const CMyClass&&>::value)
std::cout << "param is a const CMyClass r-value reference\n";
else if (std::is_same<T, const CMyClass>::value)
std::cout << "param is a constant CMyClass\n";
else if (std::is_same<T, CMyClass>::value)
std::cout << "param is a CMyClass\n";
else
std::cout << "param is not a CMyClass\n";
}


CMyClass mc3;
func(std::move(mc3));

这个小程序的输出是

param is a CMyClass
param is a CMyClass

请问为什么没有将 mc3 的类型推导为 r 值引用?

最佳答案

我找不到一个很好的骗局,尽管某个地方肯定存在,抱歉。

扣除规则:

template <class T>
void foo(T&& )

在通话的上下文中 foo(expr)是:

  • 如果exprU 类型的左值, 然后 T推导为 U&和类型 T&&U& ,由于引用崩溃。
  • 如果exprU 类型的右值, 然后 T推导为 U类型 T&&U&& , 由于引用崩溃。

在您的示例中,std::move(mc3)CMyClass 类型的右值(特别是 xvalue) .因此,T推导为 CMyClass .此检查:

else if (std::is_same<T, CMyClass&&>::value)
std::cout << "param is a CMyClass r-value reference\n";

几乎永远不会像 T 一样真实永远不会推断为右值引用类型。它可以这样具体提供:

func<CMyClass&&>(std::move(mc3));

但这是不太可能的用法。你可以做的是检查:

else if (std::is_same<T&&, CMyClass&&>::value)
// ~~~~

这将处理参数为右值的所有情况。事实上,如果你总是检查 T&& ,这将妥善处理您的所有案件。

关于c++ - 类型未推断为右值引用 : why not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145453/

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