昨天我在这里看到了一个关于结构化绑定的有趣问题<我们可以总结如下。考虑下面的示例代码:
#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)>);
}
在这种情况下dectype(a)
是int
(可能),因为这个项目符号(工作草稿):
如果e
是命名结构化绑定[...]的无括号id表达式,dectype(e)
是结构化绑定声明规范中给出的引用类型
这是@Curity在评论中为感兴趣的人提供的关于wandbox的片段。它表明实际上a
不是引用,仅此而已。
到目前为止,对于最初的问题,OP问为什么它是int
而不是int
不管怎样,我想知道委员会为什么决定这么做。一天结束时,
a
引用元组中的一个元素,我可以通过a
修改该元素。换句话说,a
的声明看起来像引用的声明,它的行为类似于引用,但它不是引用。
我可以接受,但我想知道这背后的原因是什么。为什么
decltype(a)
不能只是int
这个主题之前已经讨论过(查看structured bindings标签),第二个答案中甚至提到了您所讨论的行为。然而,p0144r2第3.5节阐述了基本原理:
语法应该扩展为允许const吗/
例如:
auto [&x, const y, const& z] = f(); // NOT proposed
我们认为答案是否定的。这是一个简单的特征,用来存储一个值并将名称绑定到其组件上,而不是声明多个变量。允许这种限定将是特征蠕变,将特征扩展为不同的东西,即声明多个变量的一种方式。
如果我们确实想声明多个变量,我们已经有了拼写它的方法:
auto val = f();
T& x = get<0>(val);
T2 const y = get<1>(val);
T3 const& z = get<2>(val);
我昨天写的:
decltype(x)
,其中x
是结构化绑定,命名该结构化绑定的引用类型。在类似元组的情况下,这是由std::tuple_元素
返回的类型,它可能不是引用,即使在这种情况下,结构化绑定本身实际上始终是引用。这有效地模拟了绑定到结构的行为,该结构的非静态数据成员具有由tuple_元素
返回的类型,绑定本身的引用性只是实现细节。
我有多个参数要引用,但我不想一个一个地指定它们。
我有三个表在我的应用程序,把它们称为,,和。有字段为和,两者都有索引。有字段带索引,有字段带索引。 当我执行以下查询时: 它真的很慢(约1秒)。 当我执行以下查询时: 速度非常快(约20毫秒)。 据我所知,这些桌子大小差不多 关于这两个查询之间的巨大性能差异,有什么想法吗? 表大小: > tableA:2061392行 表B:175339行 TableC: 1888912行 postgresql-
我正在学习结构化绑定声明。我的理解是,
我有两个表两个表名
我正在使用Mockito进行单元测试,我得到了以下异常。 这是否是return语句的一个问题,因为format()方法是最后一个方法。 我该如何解决这件事?