通用引用是如何推导出来的
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
推断出什么。它确实推导出 int
。 v
是 auto&&
类型,即 int&&
如果T
是一个模板参数(或auto
)并且T&&
用于推导T
,那么:
- 如果参数是
U
类型的右值(xvalue 或 prvalue),则 T
被推导为 U
而 T&&
是 U&&
.
- 如果参数是
U
类型的左值,则 T
被推导为 U&
而 T&&
为 U&&
.
您的困惑可能源于混淆了模板参数的类型 T
和推导函数参数的类型 T&&
.
请注意,由于 T&&
总是扩展为引用类型,因此转发引用确实是一个引用,永远不会导致表达式按值传递。
关于 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
推断出什么。它确实推导出 int
。 v
是 auto&&
类型,即 int&&
如果T
是一个模板参数(或auto
)并且T&&
用于推导T
,那么:
- 如果参数是
U
类型的右值(xvalue 或 prvalue),则T
被推导为U
而T&&
是U&&
. - 如果参数是
U
类型的左值,则T
被推导为U&
而T&&
为U&&
.
您的困惑可能源于混淆了模板参数的类型 T
和推导函数参数的类型 T&&
.
请注意,由于 T&&
总是扩展为引用类型,因此转发引用确实是一个引用,永远不会导致表达式按值传递。