通用引用是如何推导出来的

How Universal References get deduced

关于 Universal references 的事情让我很困惑,我知道

T&& + lvalue => T&
T&& + rvalue => T&&

然后我听到 Scott Meyers 说:有 "special rule for universal references" 即:

T&& + rvalue => T (NOT T&&)

所以我做了简单的测试,认为它会解决问题

int i = 32;
auto&& v = std::move(i); // assigning xvalue

// According to Scott: auto&& is URef
// And according to the "rule" v should get deduced to T
// VS2015 tells me this is int&& (NOT int)... huh???

auto&& x = int(8); // assigning prvalue
// same as above ... hmmm

那么我在这里错过了什么......我真的需要理解这个......

URef 被推导为 T&& 以及当它被推导为 T 时...我希望有示例来帮助解决问题...谢谢

注意:我已经搜索过了,所以我找到了相关问题,但没有找到这个问题的具体答案。

你忘了你是从哪里开始的。整个想法是看 auto 推断出什么。它确实推导出 intvauto&& 类型,即 int&&

如果T是一个模板参数(或auto)并且T&&用于推导T,那么:

  • 如果参数是 U 类型的右值(xvalue 或 prvalue),则 T 被推导为 UT&&U&&.
  • 如果参数是 U 类型的左值,则 T 被推导为 U&T&&U&&.

您的困惑可能源于混淆了模板参数的类型 T 和推导函数参数的类型 T&&.

请注意,由于 T&& 总是扩展为引用类型,因此转发引用确实是一个引用,永远不会导致表达式按值传递。