C++ C++;基本CTOR澄清-为什么不调用赋值/复制构造函数
下面是我的示例程序: 当我编译并运行以下程序时,我得到了输出:C++ C++;基本CTOR澄清-为什么不调用赋值/复制构造函数,c++,c++11,C++,C++11,下面是我的示例程序: 当我编译并运行以下程序时,我得到了输出: #include <iostream> class A { public: explicit A() { std::cout << "A CTOR\n" << std::flush; } ~A() { std::cout << "A DTOR\n" << std::flush;
#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());
}
我原以为会调用A的默认构造函数,然后在第一行调用复制赋值ctor,在第二行调用移动ctor?但这似乎没有发生?为什么?我想我缺少一些基本的理解
请澄清何时将实际调用哪些CTOR?不要让
=
操作员打扰您。第一行中发生的只是一个默认构造函数调用。不需要复制赋值(编译器省略了这一点),因为您没有将任何内容赋值给a
但以下情况将导致您所寻找的结果:
A a, c; //A CTOR
c = a; //A DEEP COPY = CTOR because c is being assigned the value of a
第二行只是一个函数声明
A b(A());
b
是一个函数,它将a
作为参数并返回a
。这种歧义通常被称为最令人烦恼的解析
CPP标准草案(N4713)规定:
9.8歧义解决方案[stmt.ambig]
第二行是函数声明,不是变量定义+初始化;
b
是函数,不是a
类型的对象。从概念上讲,第一行是复制初始化,但复制构造函数是。我添加了显式关键字,但仍然是相同的outputassignment运算符不是构造函数可能是重复的当然,因为第2行是一个函数声明,而不是a的实例化。请参阅答案的第二部分。谢谢-您能否提供调用CTOR的任何进一步规则-这将非常有用-同样是因为我们应该编写哪些CTOR-小心-否则我们将创建一个大型类ob被复制的软件是默默的或深刻的,Scott Meyers的C++有一个完整的章节。这是那本书的第2章。很好地解释。你的库应该有一个副本。
A b(A());