C++11 r值引用和指针之间的精确对应关系? 这是C++语言中指针与引用类型之间对称性的一般问题。 此对应表在C++(C++ 11及以上)中有意义吗?< /强> < /P> +-----------+----------------+ | Reference | Pointer | |-----------|----------------| | T& | T* const | | T const& | T const* const | | T&& | ???* | +-----------+----------------+

C++11 r值引用和指针之间的精确对应关系? 这是C++语言中指针与引用类型之间对称性的一般问题。 此对应表在C++(C++ 11及以上)中有意义吗?< /强> < /P> +-----------+----------------+ | Reference | Pointer | |-----------|----------------| | T& | T* const | | T const& | T const* const | | T&& | ???* | +-----------+----------------+,c++11,pointers,move-semantics,rvalue-reference,C++11,Pointers,Move Semantics,Rvalue Reference,如果有的话,什么对应于?*?。(缺少任何其他行?) (T&&表示具体类型T,而不是推断类型。请参阅@ComicSansMS回答以了解尾随的常量) 我猜它会对应类似的东西,但它不是一个内置的语言特性,而且它似乎会产生一系列其他问题(比如std::reference\u wrapperdoes) 该语言是否缺少某种更对称的r值指针?或者更好的说法是在derreference上生成r值的东西(例如,移动的对象,甚至是副本) 我知道r值引用对应于“没有名称”的东西,但是,如果仅为一个遵从操作获得相同的值

如果有的话,什么对应于
?*
?。
(缺少任何其他行?)

T&&
表示具体类型
T
,而不是推断类型。请参阅@ComicSansMS回答以了解尾随的
常量

我猜它会对应类似的东西,但它不是一个内置的语言特性,而且它似乎会产生一系列其他问题(比如
std::reference\u wrapper
does)

该语言是否缺少某种更对称的r值指针?或者更好的说法是在derreference上生成r值的东西(例如,移动的对象,甚至是副本)

我知道r值引用对应于“没有名称”的东西,但是,如果仅为一个遵从操作获得相同的值,则这似乎不是构造性的


注1:

我看到在C++20中不推荐使用。 我不确定这意味着什么,也许这意味着它不能被实现,有时是选择性的。 这个问题与此不推荐相关,因为原则上
std::move\u iterator::operator->()
可以返回
?*
而不是
指针。
(或者返回
move\u迭代器
,尽管这将生成
->()
运算符的无限回归…除非有一个真正的指针用于终止r值。)


注2: 我可以想象的一个候选行缺失是:

| void& (not a thing)  | void*     |
但我认为这与问题中提出的对应关系无关,而是语言中的
void
的正常不规则性。

没有“指针和引用类型之间的对称性”。或者至少,没有人打算这样做。你可以随心所欲地解释语言,但你看到的任何对称都是偶然的

在大多数情况下,左值和右值引用的工作方式相同。主要区别在于,您可以按类型区分它们(因此可以重载函数或影响基于它们的模板实例化),并且它们对绑定的对象有不同的规则,特别是在重载解析下。区分的目的是使类型系统更准确地传达源对象的值类别,以便用户能够更多地了解如何合理处理引用对象

指针不需要这样做,所以它们不需要进行这种区分

这一对应表在C++(C++ 11及以上)中有意义吗?< /P> 将引用视为实现指针语义的一种语法上不同的方式可能是一种有用的心智模型。 表中缺少的关键点是,与引用等价的不是指针,而是常量指针:

| Reference | Pointer        |
|-----------|----------------|
| T&        | T* const       |
| T const&  | T const* const |
请注意,这是一个非常粗略的真理近似值,很快就会分解。这里所有的警告都适用。而且,
T const&
将绑定到临时变量,而
T const*const
将非常不绑定

现在谈谈
T&
缺少的行。
T&&
的心智模型这里是一个始终允许您移动的参考。在函数体中,该函数的
T&&
参数可以被完全视为
T&
参数,只有在涉及到移动时才具有特殊语义。另一方面,对于所述函数的调用者,
T&&
不同于任何已知的引用或指针类型,因为它不仅将绑定到未命名的临时变量(如
T const&
所做的),而且实际上只绑定到临时变量,而不绑定其他变量。 您可以自己弄明白为什么指针的等效概念虽然可以想象,但对语言来说并不是一个非常有用的补充

关于您的注释1:弃用意味着该对象被标记为从标准中删除。虽然目前实现仍然支持它,但这纯粹是为了向后兼容,新代码应该避免使用不推荐的功能。不应再使用
move\u iterator
上的此功能的原因,正是因为缺少可从该语言安全使用的指针的概念


关于注释2:由于历史原因,指针和引用之间的另一个关键区别是指针类型在某种程度上是可相互转换的。也就是说,即使
T
U
是不相关的类型,指针
T*
也可以强制转换为
U*
。这种行为被许多人认为是C语言遗留下来的一种非常危险的行为,在很大程度上被认为是不可取的。在任何情况下,引用都不允许进行此类转换。这将提示您为什么
void&
在该语言中不是有效的数据类型。

???*
最合适的是
T*
afaik。我认为不可能单独使用xvalue指针。在ABI级别,右值引用和左值引用都被认为是非空常量指针。@Oliv,这很有意义。那么,区别必须是纯语义的。无论什么是
它都可以通过一个从不为空的指针来实现。@alfC至少这是根据system V abi(当编译器以Linux或BSD平台为目标时)实现它们的方式。每当标准约束被引用或指向的对象时,对称性就会出现在标准中,例如: