C++ 构造函数和右值
C++ constructor and rvalue
我正在阅读 this post。关注的代码如下
struct S {
void func() &;
void func() &&;
};
S s1;
s1.func(); // OK, calls S::func() &
S().func(); // OK, calls S::func() &&
我想我明白什么是参考限定符。我的问题更基本:什么是 S()
?它是(副本)创建者吗?为什么它是右值?似乎在那个博客和其他地方,它被认为是理所当然的。我错过了什么?
S()
创建一个右值临时对象。该对象是使用默认构造函数构造的。它在完整表达式被评估后立即被销毁。
更一般地说,考虑此语法的一种方法是:传递给对象构造函数的类型名称 + 参数列表。
在这种情况下,S
是类型名称,空括号表示构造函数没有参数,因此选择默认构造函数。
形式上它是显式转换(函数符号)。它从(可能为空的)参数列表中创建一个临时对象。是的,它通过执行重载决策来选择正确的构造函数来调用。在这种情况下,默认的 c'tor(您的编译器生成,因为没有声明其他 c'tor)。
更正式地说,显式转换是一个表达式,其结果是纯右值(纯右值)。因此,在进行重载决策以选择要调用的成员函数时,最好使用右值限定版本。
我想博客会略过它,因为它自远古以来就存在于 C++ 中。 post 的目的是引入一个新概念,假设读者已经了解 C++。
我正在阅读 this post。关注的代码如下
struct S {
void func() &;
void func() &&;
};
S s1;
s1.func(); // OK, calls S::func() &
S().func(); // OK, calls S::func() &&
我想我明白什么是参考限定符。我的问题更基本:什么是 S()
?它是(副本)创建者吗?为什么它是右值?似乎在那个博客和其他地方,它被认为是理所当然的。我错过了什么?
S()
创建一个右值临时对象。该对象是使用默认构造函数构造的。它在完整表达式被评估后立即被销毁。
更一般地说,考虑此语法的一种方法是:传递给对象构造函数的类型名称 + 参数列表。
在这种情况下,S
是类型名称,空括号表示构造函数没有参数,因此选择默认构造函数。
形式上它是显式转换(函数符号)。它从(可能为空的)参数列表中创建一个临时对象。是的,它通过执行重载决策来选择正确的构造函数来调用。在这种情况下,默认的 c'tor(您的编译器生成,因为没有声明其他 c'tor)。
更正式地说,显式转换是一个表达式,其结果是纯右值(纯右值)。因此,在进行重载决策以选择要调用的成员函数时,最好使用右值限定版本。
我想博客会略过它,因为它自远古以来就存在于 C++ 中。 post 的目的是引入一个新概念,假设读者已经了解 C++。