C++构造函数问题
C++ constructor issues
我想知道是否有人可以帮助解决在我看来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
的匿名实例的函数的声明。
相关文章:
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- constexpr构造函数需要常量成员函数时出现问题
- 有关 c++ 构造函数的问题
- 关于复制构造函数的一个棘手问题
- 复制构造函数隐式转换问题
- 构造函数 (C++) 中的 char 指针参数存在问题
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 关于 std::bitset 构造函数的几个问题?
- 构造函数和 G++ 编译配方的问题
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- C++ 关于两个类构造函数的问题
- 在构造函数 c++ 中初始化属性时出现问题
- 空构造函数和值传递问题
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 复制和赋值构造函数的问题
- 变分模板递归构造函数问题
- C++中用户定义的构造函数出现问题
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- C++的抽象类继承和构造函数的问题
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?