Dan*_*ica 9 c++ reference decltype c++17 structured-bindings
据我所知,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,我会0在1第二种情况下进入第一种情况.这是为什么?
如果我打印出来
std::is_reference<decltype(a)>::value,我在第一种情况下得到0,在第二种情况下得到1.
为什么即使我们可以证明a并b引用元组中的元素并且可以通过它们修改这些值?
我不是语言律师,但可能是因为这个标准(工作草案)的子弹:
if
e是一个未加括号的id-expression,用于命名结构化绑定[...],decltype(e)是结构化绑定声明规范中给出的引用类型
边注.您应该使用此表单来执行此操作a并b引用元组中的元素:
auto tup = std::make_tuple(1, 2);
auto & [ a, b ] = tup;
Run Code Online (Sandbox Code Playgroud)
它遵循一个最小的工作示例:
#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;
}
Run Code Online (Sandbox Code Playgroud)
在Coliru看到它.另一方面,您得到的是使用以下表达式的值的副本:
auto [ a, b ] = std::make_tuple(1, 2);
Run Code Online (Sandbox Code Playgroud)
这是更好地解释它是比标准更容易理解一点的文章人类.