Информация об изменениях

Сообщение Re[5]: Почему нельзя писать void ctor(); от 27.04.2017 22:11

Изменено 27.04.2017 22:21 N. I.

Re[5]: Почему нельзя писать void ctor();
CRT:

CRT>Хорошо, A(1024) это преобразование типа.

CRT>Но вот это
CRT>
A obj = A(1024,"ъъъ");

CRT>уже явно не выглядит как преобразование типа

Однако, формально это тоже относится к преобразованию типа — Explicit type conversion (functional notation) — от списка из нескольких выражений.

CRT>а именно как вызов конструктора напрямую , который возвращает значение.


Конструктор только инициализирует объект, но выделением того участка памяти, которая становится объектом (и размер которой мы можем узнать с помощью sizeof), он не занимается. Деструктор объекта он обычно тоже не вызывает. Как и определение переменной A a(1024,"ъъъ"); , выражение A(1024,"ъъъ") приводит не только к вызову конструктора, но ещё и резерированию памяти под создаваемый объект, а также к вызову деструктора в какой-то момент, а стало быть, это всё-таки более высокоуровневая штука, чем некий простой вызов конструктора. Если нужно выражение, которое по сути не делает ничего, кроме вызова конструктора (с предшествующей инициализацией его параметров), то для этого надо использовать что-то вроде ::new((void *)pointer) A(1024,"ъъъ"), где pointer указывает на участок памяти, который мы собираемся отвести под объект. Хотя формально тут всё же есть ещё вызов функции operator new, эта версия operator new реально ничего не делает, а потому фактическая функциональность такого выражения сводится к вызову конструктора.

CRT>А по мне так конструктор с одним параметром — это частный случай конструктора с N параметрами.


А как тебе вот такой пример?

#include <iostream>

struct A
{
    A(A &&) = delete;
    int n;
};

A f()
{
    return A{1024};
}

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

По правилам C++17 здесь нет ни одного вызова конструктора A (собственно, такой A даже не имеет ни одного конструктора, который было бы допустимо вызывать), и, тем не менее, эта программа вполне рабочая.
Re[5]: Почему нельзя писать void ctor();
CRT:

CRT>Хорошо, A(1024) это преобразование типа.

CRT>Но вот это
CRT>
A obj = A(1024,"ъъъ");

CRT>уже явно не выглядит как преобразование типа

Однако, формально это тоже относится к преобразованию типа — Explicit type conversion (functional notation) — от списка из нескольких выражений.

CRT>а именно как вызов конструктора напрямую , который возвращает значение.


Конструктор только инициализирует объект, но выделением того участка памяти, которая становится объектом (и размер которой мы можем узнать с помощью sizeof), он не занимается. Деструктор объекта он обычно тоже не вызывает. Как и определение переменной A a(1024,"ъъъ"); , выражение A(1024,"ъъъ") приводит не только к вызову конструктора, но ещё и резервированию памяти под создаваемый объект, а также к вызову деструктора в какой-то момент, а стало быть, это всё-таки более высокоуровневая штука, чем некий простой вызов конструктора. Если нужно выражение, которое по сути не делает ничего, кроме вызова конструктора (с предшествующей инициализацией его параметров), то для этого надо использовать что-то вроде ::new((void *)pointer) A(1024,"ъъъ"), где pointer указывает на участок памяти, который мы собираемся отвести под объект. Хотя формально тут всё же есть ещё вызов функции operator new, эта версия operator new реально ничего не делает, а потому фактическая функциональность такого выражения сводится к вызову конструктора.

CRT>А по мне так конструктор с одним параметром — это частный случай конструктора с N параметрами.


А как тебе вот такой пример?

#include <iostream>

struct A
{
    A(A &&) = delete;
    int n;
};

A f()
{
    return A{1024};
}

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

По правилам C++17 здесь нет ни одного вызова конструктора A (собственно, такой A даже не имеет ни одного конструктора, который было бы допустимо вызывать), и, тем не менее, эта программа вполне рабочая.