昨天我在这里看到了一个关于结构化绑定的有趣问题。
我们可以总结如下。考虑下面的示例代码:
#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)
(int
可能)是因为这个项目符号(工作草案):
if
e
是命名结构化绑定 [...] 的无括号 id 表达式,decltype(e)
是结构化绑定声明规范中给出的引用类型
这是@Curious 在评论中为感兴趣的人提供的关于魔杖盒的片段。它表明这实际上a
不是参考,仅此而已。
到目前为止,对于原始问题来说非常好,OP 问为什么它int
不是,int &
标准说这看起来是一个可以接受的答案。
无论如何,我想知道委员会为什么会这样决定。归根结底,a
指的是元组中的一个元素,我可以通过a
. 换句话说,声明a
看起来像一个引用,它的行为类似于引用,但它不是引用。
我可以忍受这个,但我想知道这背后的原因是什么。为什么decltype(a)
不能简单int &
?有没有一个世俗的人可以理解的有意义的理由?