1

我想知道是否有人可以帮助我解决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 (*)())’

谢谢!

4

3 回答 3

3

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

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

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

ClassA x2((ClassB()));    // parenthesized expression is never a type declaration
于 2013-01-23T22:08:29.063 回答
1

ClassA myClassA(ClassB());声明一个被调用的函数myClassA,该函数返回 aClassA并接受一个参数,该参数是一个指向返回 aClassB且不接受任何参数的函数的指针。这是最令人头疼的解析

于 2013-01-23T22:09:37.487 回答
1

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

首先,ClassB 确实有一个构造函数。当您不创建自己的一个时,编译器会为您提供一个。在您ClassB将.ClassAClassB

于 2013-01-23T22:14:26.917 回答