Допустимо ли `A a = A ()`?Какие операторы / методы вызываются ниже? - PullRequest
3 голосов
/ 19 апреля 2019

С учетом следующего кода:

#include <iostream>

class A {
 public:
  int x;

 public:
  A() : x(0) { std::cout << "ctor" << std::endl; }
  A(const A& o) : x(o.x) { std::cout << "copy ctor" << std::endl; }
  A& operator=(const A& o) { x = o.x; std::cout << "copy asgnmt" << std::endl; return *this; }
};

int main() {
  A a = A();
  return 0;
}

Приведенный выше код выполняется с g++ 4.8.4 на Ubuntu 14.04:

g++ -g -o test test.cpp

И вывод:

ctor

Соответствует ли A a = A(); стандарту (ам) C ++? Или это просто UB, поэтому зависит от компилятора? Если этот код соответствует стандарту, то какие методы вызываются ниже? A() вообще ничего не должно возвращать, не так ли?

1 Ответ

7 голосов
/ 19 апреля 2019

A() выполняет инициализацию значения , что создает временный объект без имени.

A a = A(); - это копия инициализации , a инициализируется из вышеуказанного временного. Как видно из выходных данных, конструктор по умолчанию A используется для прямой инициализации a здесь из-за copy elision .

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