相关疑难解决方法(0)

结构化绑定:当某些内容看起来像引用并且行为类似于引用时,但它不是引用

昨天我在SO上看到了一个关于结构化绑定的有趣问题.
我们可以总结如下.请考虑以下示例代码:

#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)>);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下decltype(a)int(可能),因为这种子弹(工作草案):

if e是一个未加括号的id-expression,用于命名结构化绑定[...],decltype(e)是结构化绑定声明规范中给出的引用类型

是@Curious在评论中为感兴趣的人提供的wandbox片段.它表明实际上a不是参考,仅此而已.
到目前为止好于原来的问题,OP问为什么它int,而不是int &标准说,看上去像一个可以接受的答案.

无论如何,我想知道委员会为何如此决定.在一天结束时,a引用元组中的元素,我可以通过修改该元素a.换句话说,声明a看起来像一个引用,它的行为类似于引用,但它不是引用.

我可以忍受这个,但我想知道背后的原因是什么.为什么decltype(a)不能简单int &?亵渎者可以理解是否有一个有意义的理由?

c++ language-lawyer c++17 structured-bindings

20
推荐指数
1
解决办法
1018
查看次数

结构化绑定在C++ 17中引入的标识符类型有哪些?

据我所知,C++ 17中结构化绑定引入的标识符实际上是对某些"隐藏"变量的引用.这样

auto [ a, b ] = std::make_tuple(1, 2);
Run Code Online (Sandbox Code Playgroud)

一种等同于

auto e = std::make_tuple(1, 2);
auto& a = std::get<0>(e);
auto& b = std::get<1>(e);
Run Code Online (Sandbox Code Playgroud)

但是,如果我打印出来std::is_reference<decltype(a)>::value,我会01第二种情况下进入第一种情况.这是为什么?

c++ reference decltype c++17 structured-bindings

9
推荐指数
1
解决办法
409
查看次数