【发布时间】:2017-06-22 09:39:09
【问题描述】:
昨天我在 SO 上看到 an interesting question 关于结构化绑定。
我们可以总结如下。考虑下面的示例代码:
#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(可能)因为 this bullet(工作草案):
如果
e是一个无括号的 id 表达式,命名结构化绑定 [...],则decltype(e)是结构化绑定声明规范中给出的引用类型
Here 是@Curious 在 cmets 中为感兴趣的人提供的魔杖盒上的 sn-p。它表明实际上a 不是参考,仅此而已。
到目前为止,原始问题的效果很好,OP 询问为什么它是 int 而不是 int & 并且标准说看起来是一个可以接受的答案。
无论如何,我想知道委员会为什么会这样决定。归根结底,a 指的是元组中的一个元素,我可以通过a 修改该元素。换句话说,a 的声明看起来像一个引用,它的行为类似于引用,但它不是引用。
我可以忍受这个,但我想知道这背后的原因是什么。为什么decltype(a) 不能简单地是int &?有没有一个世俗的人可以理解的有意义的理由?
【问题讨论】:
-
您能否扩展您的示例以实际证明
a不是参考?static_assertstd::is_reference<decltype(a)>::value之类的应该相当容易。 -
@TobySpeight 在原始问题中有您要的示例。话虽如此,你可以简单地打印出
std::is_reference_v<decltype(a)>,它会返回0,std:.is_same_v<decltype(a), int &>,而std:.is_same_v<decltype(a), int>会返回1。这很简单。 -
@TobySpeight 使用在线编译器wandbox.org/permlink/BKLeZRzPubEsPC5l?
-
我非常讨厌
a和b在这里不是参考 -
在section 11.5.3中,有文字说“给定
std::tuple_element<i, E>::type指定的类型Ti,每个vi都是一个类型为“引用Ti”的变量,初始化为初始化器,如果初始化器是 lvalue 和 rvalue 引用,则引用是 *lvalue 引用;引用的类型是Ti.* " 在我看来,这表明auto & [ ]应该声明引用...
标签: c++ language-lawyer c++17 structured-bindings