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

时间:2017-06-21 09:13:07

标签: c++ reference c++17 decltype structured-bindings

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

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult");
        super.onActivityResult(requestCode, resultCode, data);

    }

等同于

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。那是为什么?

2 个答案:

答案 0 :(得分:9)

  

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

为什么即使我们可以证明ab引用元组中的元素,又可以通过它们修改这些值? 我不是语言律师,但可能是由this bullet标准(工作草案)所致:

  

如果e是一个未加括号的id-expression,命名一个结构化绑定[...],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上查看。另一方面,你得到的是a copy of the values使用下面的表达式:

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

Here是一篇文章,它解释得更好,比的标准更易于理解。

答案 1 :(得分: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);