昨天我看到了一个有趣的问题这里关于结构化绑定。
我们可以总结如下。考虑下面的示例代码:
#include <tuple>
#include <type_traits>
int main() {
auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;
// the following line won't compile for a isn't a reference
// static_assert(std::is_reference_v<decltype(a)>);
}
在这种情况下decltype(a)
is int
(可能)因为这颗子弹(工作草案):
if e
是一个不带括号的 id 表达式,命名结构化绑定 [...],decltype(e)
是结构化绑定声明规范中给出的引用类型
Here是@Curious 在评论中为感兴趣的人提供的 wandbox 上的片段。这表明实际上a
不是参考,仅此而已。
到目前为止,对于最初的问题来说一切顺利,OP 问为什么int
代替int &
and 标准说看起来是一个可以接受的答案。
无论如何,我想知道委员会为什么这么决定。归根结底,a
引用元组中的一个元素,我可以通过修改该元素a
。换句话说,声明a
看起来像引用,它的行为类似于引用,但它不是引用。
我可以忍受这个,但我想知道背后的原因是什么。为什么decltype(a)
不能简单地int &
?有没有一个外邦人能够理解的有意义的理由?
我昨天写的:
decltype(x)
, where x
是一个结构化绑定,命名引用
该结构化绑定的类型。在类似元组的情况下,这是
返回类型std::tuple_element
,这可能不是参考
即使结构化绑定本身实际上始终是
本例中的参考。这有效地模仿了行为
绑定到其非静态数据成员具有以下类型的结构
由返回tuple_element
,具有绑定的参考性
本身只是一个实现细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)