C ++ Basic CTOR разъяснение - почему конструктор присваивания / копирования не вызывается - PullRequest
0 голосов
/ 16 октября 2018

Ниже приведен пример моей программы:

Когда я компилирую и запускаю следующую программу, я получаю вывод:

#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?

1 Ответ

0 голосов
/ 16 октября 2018

Не позволяйте оператору = сбить вас с толку.То, что происходит в первой строке, это просто вызов конструктора по умолчанию.Нет необходимости в назначении копирования (компилятор исключает это), потому что вы ничего не назначаете для 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]

  1. В грамматике присутствует двусмысленность, связанная с выражениями-выражениями и объявлениями: выражение-выражение с явным преобразованием типа в стиле функции в качестве крайнего левого подвыражения может быть неотличимо от объявления, где первыйобъявитель начинается с (. . В этих случаях оператор является объявлением.

  2. [Примечание: если оператор не может синтаксически быть объявлением, нет никакой двусмысленности,таким образом, это правило не применяется. Может понадобиться изучить все утверждение, чтобы определить, так ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...