Universal Reference

凌通
2023-12-01

表示c++11 添加了std::move后一直搞不清楚左值,右值神马的.下文只是个人理解(看了channel 9 上的视频后),不保证绝对正确哈!


1首先需要明确的一点

type&&  -> rvalue reference 错误

千万不要天真的以为有了&&后,就是右值引用了!


type&& 可能代表两种情况

1> rvalue reference

2> universal reference

(universal refernce这一说法来自于scott mayer, 见名知意, universal.宇宙的...意思是可以接受任何类型)


universal reference可能会在四种情况下产生:

1>

template <typename T> 

void f(T&& param)

2>

auto &&var = ...

3>

typedef declarations

4>

decltype expressions


根据scott mayer的定义:

if a variable or parameter has declared type T&& for some deduced type, its a universal reference.

(基本遵循这条规则你就阔以分辨出universal reference了)


好了,都是一些杂记,主要为了怕自己忘记

下面以视频最后的几条总结结尾

1.type&& != rvalue reference


2 not all T&&s in templates are universal references

这条很清晰了,还需要有type deduction


3.type&& + syntax + type deduction => universal references


4.whether universal reference becomes lref ot rref depends on intializer

即universal 到底表现为左值引用还是右值引用,主要依赖于其初始化的参数


5.overloading with urefs almost always wrong.

都是urefs了,再去重载本来就没什么多大意义


6.foundation is type deduction and reference collapsing.

我个人分辨左值右值主要遵循这个原则

lvalue reference to anything -> lvalue reference

rvalue reference to rvalue reference-> rvalue reference











 类似资料:

相关阅读

相关文章

相关问答