【问题标题】:C++ constructor and rvalueC++ 构造函数和右值
【发布时间】: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 类型的对象]。

标签: c++ c++11 constructor rvalue


【解决方案1】:

形式上它是一个显式转换(功能符号)。它从(可能为空的)参数列表中创建一个临时对象。是的,它通过重载决议来选择正确的构造函数来调用。在这种情况下,默认的 c'tor (由于没有声明其他 c'tor,您的编译器会生成它)。

更正式地说,显式强制转换是一个结果为纯右值(纯右值)的表达式。因此,在进行重载决策以选择要调用的成员函数时,右值限定版本更可取。

我想博客会略读它,因为它自古以来就存在于 C++ 中。这篇文章的目的是介绍一个新概念,假设读者已经了解 C++。

【讨论】:

    【解决方案2】:

    S() 创建一个临时对象,它是一个右值。该对象是使用默认构造函数构造的。它在整个表达式被求值后立即被销毁。

    更一般地,考虑这种语法的一种方法是:类型名称 + 参数列表传递给对象的构造函数。 在这种情况下,S 是类型名称,空括号表示构造函数没有参数,因此选择默认构造函数。

    【讨论】:

    • 好的,但是为什么呢? S() 调用的创建者是什么?
    • @MaPo“创造者”?你是说构造函数?默认的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多