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());