我正在学习结构化绑定声明。我的理解是,auto
所以,如果我使用
auto
#include <cstddef>
#include <tuple>
#include <type_traits>
struct Foo {
template<std::size_t i>
int get() { return 123; }
};
namespace std {
template<> struct tuple_size<Foo> : integral_constant<size_t, 1> {};
template<std::size_t i> struct tuple_element<i, Foo> { using type = int; };
}
int main() {
Foo f;
auto& [x] = f;
x++;
}
此外,C Insights清楚地表明clang将结构化绑定扩展为:
Foo f = Foo();
Foo & __f17 = f;
std::tuple_element<0, Foo>::type x = __f17.get<0>();
x++;
在这里,它声明
x
不是作为一个引用,而是作为一个值。为什么?
我预计左值引用和编译错误:
e
(__f17
在上例中)是左值引用。
这是因为auto
如果改用
auto[x]
,代码片段将扩展为如下内容
Foo f = Foo();
Foo __f17 = f; // Difference here
std::tuple_element<0, Foo>::type x = __f17.get<0>();
x++;
绑定本身始终是对底层对象的某种引用。然而,cppinsights代码并不能准确地表示这一点。C标准中的相关段落是这样说的
[dcl.struct.bind]
3否则,如果合格的id
std:: tuple_大小
在[dcl.struct.bind]9.6.4中,当初始值设定项是带有
问题内容: 为什么我应该在Python中引用“名称”和“绑定”,而不是“变量”和“赋值”?我知道这个问题有点笼统,但我真的很想知道:) 问题答案: 在C和C ++中,变量是命名的内存位置。变量的值是存储在该位置的值。分配给变量,然后修改该值。因此,变量是存储位置,而不是其名称。 在Python中,变量是用于引用对象的名称。变量的值就是该对象。到目前为止听起来像是同一件事。但是将变量赋值给变量,您
假设一个函数有两个重载 然后在另一个函数的主体中 过载<代码>f(T 这让我非常惊讶。一个带有签名
我在这里找到了最初的*C结构化绑定方案。它提出了一种轻松绑定多个返回值的方法,即: 但现在我看到每个人都指向 现在我学习了“列表是{like,this}编写的”,出现了一种新的列表语法?为什么?这里的花括号有什么问题?
现在,调用可能会调用的copy构造函数(它很可能是copy省略的,所以情况并非如此)。但将导致复制。如果包含大量数据,则可能是一个问题。 我们将通过将其作为常量引用()传递来改进它,以消除不需要的副本。只要是就可以。如果不是,则调用将导致编译错误(丢失限定符)。 所以,为什么要费心使用常量引用,只使用reference()。这很好,但对于第一种情况就不起作用了,因为将r-value绑定到(非常量)
我一直在编写一组类来允许一个简单的类似python的-函数。下面的片段(几乎)和预期的一样工作。然而,两个变量和不是。 我一直在使用gcc 7.3.0。以下是MCVE: