【问题标题】:C++ constructor issuesC++ 构造函数问题
【发布时间】:2013-01-23 22:07:30
【问题描述】:

我想知道是否有人可以帮助我解决c++gcc 最新版本)中的奇怪行为。下面是一些成功编译的代码,由于缺少适当的构造函数,我预计会出现编译时错误。谁能解释一下是怎么回事?

#include <iostream>
using namespace std;

struct ClassA {
  ClassA() {cout << "hello" << endl;} 
  void speak() {cout << "I am class A" << endl;}
  ~ClassA() {cout << "goodbye" << endl;} 
};

struct ClassB {
    // just an empty struct
};

int main() {
    ClassA myClassA(ClassB()); // trying to construct class A from an rvalue reference to class B is ok?
    return 0;
}

}

如果我尝试调用class A 的函数,我会收到编译时错误:

int main() {
    ClassA myClassA(ClassB());
    myClassA.speak();
    return 0;
}

结果:

error: request for member ‘speak’ in ‘myClassA', which is of non-class type ‘ClassA(ClassB (*)())’

谢谢!

【问题讨论】:

  • @AndyProwl,确实如此。

标签: c++ constructor rvalue most-vexing-parse


【解决方案1】:

你根本就没有声明一个对象。相反,您已经声明了一个函数,因此根本不需要构造函数。 (注意ClassB()表示函数类型!)

如果您想从临时构造对象,请尝试以下语法之一:

ClassA x1 { ClassB{} };   // C++11 only

ClassA x2((ClassB()));    // parenthesized expression is never a type declaration

【讨论】:

  • @pstrjds:我认为这只是一个普通的令人烦恼的解析。最令人头疼的问题还涉及更多。
  • 哦!我以前从未见过这些语法。谢谢!
  • @KerrekSB - 认为它足够接近参考
  • 一个普通的麻烦解析是ClassA myClassA();。这是最令人头疼的解析。
  • 非常感谢所有回答者的帮助。我爱c++,真是莫名其妙!
【解决方案2】:

ClassA myClassA(ClassB()); 声明了一个名为myClassA函数,它返回一个ClassA 并接受一个参数,该参数是一个指向返回ClassB 且不接受任何参数的函数的指针。这是most vexing parse

【讨论】:

    【解决方案3】:

    这是一种称为最令人烦恼的解析的情况。

    首先,ClassB 确实有一个构造函数。当您不创建自己的一个时,编译器会为您提供一个。在您将ClassB 的实例传递给看似有效的复制构造的那一行,实际发生的是该行被评估为一个函数的声明,该函数返回ClassA 的实例并采用匿名实例ClassB.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2011-03-13
      • 2021-06-24
      相关资源
      最近更新 更多