C++构造函数问题

C++ constructor issues

本文关键字:问题 构造函数 C++      更新时间:2023-10-16

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

谢谢!

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

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

ClassA x1 { ClassB{} };   // C++11 only
ClassA x2((ClassB()));    // parenthesized expression is never a type declaration

ClassA myClassA(ClassB());声明一个名为myClassA的函数,该函数返回一个ClassA并接受一个参数,该参数是指向返回ClassB且不带参数的函数的指针。这是最令人烦恼的解析。

这种情况称为最烦人的解析。

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