据我所知,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
。那是为什么?
答案 0 :(得分:9)
如果我打印出
std::is_reference<decltype(a)>::value
,我会在第二种情况下得到0,第一种情况为1。
为什么即使我们可以证明a
和b
引用元组中的元素,又可以通过它们修改这些值?
我不是语言律师,但可能是由this bullet标准(工作草案)所致:
如果
e
是一个未加括号的id-expression,命名一个结构化绑定[...],decltype(e)
是结构化绑定声明规范中给出的引用类型
旁注。您应该使用此表单来a
和b
引用元组中的元素:
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);