【发布时间】:2018-10-16 04:41:35
【问题描述】:
下面是我的示例程序:
当我编译并运行以下程序时,我会得到输出:
#include <iostream>
class A
{
public:
explicit A()
{
std::cout << "A CTOR\n" << std::flush;
}
~A()
{
std::cout << "A DTOR\n" << std::flush;
}
A(const A & a)
{
std::cout << "A DEEP COPY CTOR\n" << std::flush;
}
void operator = (const A & a)
{
std::cout << "A DEEP COPY = CTOR\n" << std::flush;
}
A(A && a)
{
std::cout << "A DEEP COPY MOVE CTOR\n" << std::flush;
}
void operator = (A && a)
{
std::cout << "A DEEP COPY MOVE = CTOR\n" << std::flush;
}
};
int main()
{
A a = A();
A b(A());
}
编译并运行二进制文件:
$ c++ -std=c++14 try47.cpp
A CTOR
A DTOR
我期待 A 的默认构造函数将被调用,然后在第一行复制赋值 ctor 并将 ctor 移动到第二行?但这似乎不会发生?为什么?我想我在这里缺少一些基本的理解?
请说明实际调用哪些 CTOR 的时间?
【问题讨论】:
-
第二行是函数声明,不是变量定义+初始化;
b是一个函数,而不是A类型的对象。从概念上讲,第一行是复制初始化——但复制构造函数是elided。 -
我添加了明确的关键字,但仍然是相同的输出
-
赋值运算符不是构造函数