构造函数解释为函数调用,并显式跳过移动构造函数
Constructor interpreted as function call, and move constructors strangly skipped
我有一个有 4 个构造函数的类,以及一个如下函数:
using namespace std;
class ABC {
public:
ABC() {
cout << "ABC()n";
}
ABC(int) {
cout << "ABC(int)n";
}
ABC(ABC&) {
cout << "ABC(&)n";
}
ABC(ABC&&) {
cout << "ABC(&&)n";
}
};
void ff(ABC t) { }
请帮助我解释一些对我来说很奇怪的行为(我使用 MSVC 2016 进行编译(:
1( 为什么我会收到警告 C4930:"'ABC a1(ABC (__cdecl *((void((':未调用原型函数(是否打算定义变量?
void main() {
ABC a1(ABC());
ff(ABC(5));
}
在执行时,我希望得到以下输出:
ABC()
ABC(&&)
ABC(int)
ABC(&&)
但我真正得到的是
ABC(int)
2(现在如果我更改为
void main() {
ABC a1(ABC(5));
ff(ABC(5));
}
没有更多的警告。但是在执行时,我期望得到的是
ABC(int)
ABC(&&)
ABC(int)
ABC(&&)
但我真正得到的是
ABC(int)
ABC(int)
3( 现在
void main() {
ABC( ABC() );
ff(ABC(5));
}
它甚至不编译。我收到错误 C2660:"'ABC':函数不接受 1 个参数"。
4(最后,为什么下面的编译而3(没有?
void main() {
ff(ABC(5));
}
由于被称为C++中最烦人的解析的问题,该行
ABC a1(ABC());
声明a1
是一个函数,其返回类型为ABC
,其参数类型为不带参数并返回ABC
的函数。
该行
ABC(ABC());
是一个更难剖析的,但它也是一个函数的声明,而不是变量的定义。
int(a);
是变量a
的有效声明。它与:
int a;
同样,带有ABC
的行与
ABC ABC();
在这里,ABC
具有超载的意义。第一个ABC
是类型名称。第二个ABC
是函数名称(由于最令人烦恼的解析(。它声明ABC
是一个不带参数并返回类型为ABC
的对象的函数。对于函数的其余部分,ABC
是函数名称,而不是类型名称。因此
ff(ABC(5));
无效,因为在该上下文中ABC
是一个不带参数的函数。
对于为什么不调用移动构造函数的问题,我没有答案。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中