Почему конструктор A не вызывается для оператора A x(A())?

Это очень простой вопрос о C++. Почему не вызывается конструктор для оператора "A x(A())"?

В следующем коде, который я запускал с g++ 4.8.2, конструктор (как и деструктор) вызывается только один раз. Это может быть связано с оптимизацией, но мне любопытен тип x, о котором сообщает typeid, который является «A (A (*) ())».

#include <iostream>
#include <typeinfo>
#include <cxxabi.h>
using namespace std;

class A{
 public:
 ~A() { cout << "Destructed" << endl; }  
};

int main() {
   int status;

   A x(A());
   cout << abi::__cxa_demangle(typeid(x).name(),0,0,&status) << endl;

   A a ;
   cout << abi::__cxa_demangle(typeid(a).name(),0,0,&status) << endl;

   return 0;
}

person argmin    schedule 06.09.2015    source источник
comment
Используйте A x(A{}); или A x{A()}; или A x{A{}}; или A x((A()));   -  person Piotr Skotnicki    schedule 06.09.2015
comment
@πάνταῥεῖ какая копия ?   -  person Piotr Skotnicki    schedule 06.09.2015


Ответы (1)


Это широко известно как синтаксический анализ C++, что означает, что почти все, что может быть проанализировано как объявление функции, будет.

Таким образом, A x(A()); действительно является объявлением функции, которая принимает указатель на функцию типа A() в качестве параметра, а возвращаемый тип — A.

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

A x((A()));

Потому что недопустимо заключать объявление формального параметра в круглые скобки, но допустимо заключать аргумент вызова функции в круглые скобки, поэтому, добавляя пару круглых скобок, мы заставляем компиляторы смотреть на вещи по-нашему.

person songyuanyao    schedule 06.09.2015
comment
Большое спасибо. Моя голова бегала кругами. - person argmin; 06.09.2015