Re[7]: Почему нельзя писать void ctor();
От: N. I.  
Дата: 28.04.17 21:37
Оценка:
uzhas:

U>а можно пояснить, почему нет вызова конструктора?


A{1024} выполняет aggregate initialization, которая инициализирует объект типа A без привлечения конструкторов. По новым правилам результат A{1024}, return object функции f, результат преобразования A(f()) и obj — это один и тот же объект; никаких дополнительных объектов типа A нигде не создаётся.

Отдельного упоминания заслуживает вот такой пример:

#include <iostream>

void *ptr;

struct X
{
    X() { ptr = this; }
};

struct A
{
    A(A &&) = delete;
    X x;

private:
    A(A &) = default;
};

A f()
{
    return A{};
}

int main()
{
    A obj = A(f());
    std::cout << (&obj == ptr) << std::endl;
    std::cout << &obj << std::endl;
    std::cout << ptr << std::endl;
}

Здесь наличие конструктора A(A &) позволяет делать копию объекта при возврате из функции f (то, что конструктор приватный и не может принимать rvalue типа A, в данном случае роли не играет), отчего равенство (&obj == ptr) может не соблюдаться. Хотя gcc 8 пока что имеет наглость создавать копию и при полном отсутствии non-deleted copy/move-конструкторов, что, насколько я вижу, является нарушением правил.

U>вот тут видно, что деструктор вызывается: https://wandbox.org/permlink/UB1kdA5fS0h2Mo5Q

U>значит, был вызов и конструктора?

Объект классового типа может быть инициализирован без использования конструктора, это никак не мешает ему быть уничтоженным с помощью деструктора.
Отредактировано 28.04.2017 21:41 N. I. . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.