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 就像 3int 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++ 构造函数和右值的主要内容,如果未能解决你的问题,请参考以下文章

c++复习笔记——右值引用(概念,使用场景),移动拷贝构造函数,赋值拷贝构造函数。

c++中的构造函数

C++补充篇- C++11 及其它特性

C++左值右值和构造函数们

右值引用,移动语义,完美转发

C++ 函数透明地采用左值和右值参数