11

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

auto [ a, b ] = std::make_tuple(1, 2);

有点等价

auto e = std::make_tuple(1, 2);
auto& a = std::get<0>(e);
auto& b = std::get<1>(e);

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

4

2 回答 2

9

如果我打印出来std::is_reference<decltype(a)>::value,我在第一种情况下得到 0,在第二种情况下得到 1。

为什么即使我们可以证明ab引用元组中的元素并且可以通过它们修改这些值?
我不是语言律师,但可能是由于标准的这个项目符号(工作草案):

ife是命名结构化绑定 [...] 的无括号 id 表达式,decltype(e)是结构化绑定声明规范中给出的引用类型


边注。您应该使用此表单来执行此操作ab引用元组中的元素:

auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;

它遵循一个最小的工作示例:

#include <tuple>
#include <type_traits>
#include <iostream>

int main() {
    auto tup = std::make_tuple(1, 2);
    auto & [ a, b ] = tup;
    a = 0;
    std::cout << a << ", " << std::get<0>(tup) << std::endl;
}

在Coliru上看到它。另一方面,您得到的是使用以下表达式的值的副本:

auto [ a, b ] = std::make_tuple(1, 2);

是一篇比人类标准更好地解释它并且更易于理解的文章。

于 2017-06-21T09:34:07.927 回答
1

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

如果“参考”是指语言结构参考,那么这并不完全正确。声明中的说明符属于您所说的“隐藏变量”。引用限定符是可选的。您提供的代码将更像这样:

const auto& e = std::make_tuple(1, 2);
using E = remove_reference_t<decltype((e))>;
std::tuple_element<0, E>::type& a = get<0>(e);
std::tuple_element<1, E>::type& b = get<1>(e);
于 2017-06-21T09:53:59.280 回答