C++ 构造函数和右值
Posted
技术标签:
【中文标题】C++ 构造函数和右值【英文标题】:C++ constructor and rvalue 【发布时间】:2018-06-20 09:05:22 【问题描述】:我正在阅读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
对象的value initialization。
S()
是 S myS
就像 3
是 int I(3)
;或更准确地说,int(3)
是 int I(3)
。 S() 调用构造函数,但是因为您没有输入变量名,所以它被创建为临时或右值。 [可悲的是,S myS()
会是一个更好的例子,但由于最令人头疼的解析,它实际上声明了一个名为 myS 的外部函数,该函数返回一个 S 类型的对象]。
【参考方案1】:
形式上它是一个显式转换(功能符号)。它从(可能为空的)参数列表中创建一个临时对象。是的,它通过重载决议来选择正确的构造函数来调用。在这种情况下,默认的 c'tor (由于没有声明其他 c'tor,您的编译器会生成它)。
更正式地说,显式强制转换是一个结果为纯右值(纯右值)的表达式。因此,在进行重载决策以选择要调用的成员函数时,右值限定版本更可取。
我想博客会略读它,因为它自古以来就存在于 C++ 中。这篇文章的目的是介绍一个新概念,假设读者已经了解 C++。
【讨论】:
【参考方案2】:S()
创建一个临时对象,它是一个右值。该对象是使用默认构造函数构造的。它在整个表达式被求值后立即被销毁。
更一般地,考虑这种语法的一种方法是:类型名称 + 参数列表传递给对象的构造函数。
在这种情况下,S
是类型名称,空括号表示构造函数没有参数,因此选择默认构造函数。
【讨论】:
好的,但是为什么呢?S()
调用的创建者是什么?
@MaPo“创造者”?你是说构造函数?默认的。以上是关于C++ 构造函数和右值的主要内容,如果未能解决你的问题,请参考以下文章