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

Сообщение Re[6]: Почему нельзя писать void ctor(); от 24.04.2017 14:42

Изменено 24.04.2017 15:19 rg45

Re[6]: Почему нельзя писать void ctor();
Здравствуйте, Максим Рогожин, Вы писали:

N>>А почему этот синтаксис надо запрещать?

МР>Потому, что конструктор это функция, которая не возвращает никаких значений. Вот, например
МР>
МР>A obj = A(1024);            // значит и так нельзя писать... Потому, что функция-конструктор,
МР>                            // с точки зрения синтаксиса, похожа на функцию createObject(int) тем, 
МР>                            // что у нее нет возвращаемого значения.
МР>


Ты сам себя загоняешь в заблуждение, пытаясь рассматривать это выражение как значение, возвращаемое функцией. В то время как никто никого здесь не возвращает — это прямое конструировние объекта имя типа которого задается конструктором. Это по смыслу то же самое что и
int obj = int(1024);

Нет здесь никакого возвращаемого значения, видишь?

Сам по себе конструктор — это всего лишь процедура, единственная задача которой сконструировать объкт в заданной области памяти. Указатель на эту область памяти передается конструктору неявно, и доступна эта область памяти внутри конструктора как this. Никаких значений он возвращать не может в принципе, потому что один и тот же конструктор может вызываться:

для создания rvalue объекта во временной области памяти:
const auto& obj = A(1024);
aFunction(A(1024) + A(42));

в статической или автоматической:
A obj(1024);

в динамической:
A* obj = new A(1024);

а также в неизвестной:
new(aPointer) A(1024);

И это все одна и та же процедура! Как она может что-то возвращать при таком разнообразии сценариев использования?
Re[6]: Почему нельзя писать void ctor();
Здравствуйте, Максим Рогожин, Вы писали:

N>>А почему этот синтаксис надо запрещать?

МР>Потому, что конструктор это функция, которая не возвращает никаких значений. Вот, например
МР>
МР>A obj = A(1024);            // значит и так нельзя писать... Потому, что функция-конструктор,
МР>                            // с точки зрения синтаксиса, похожа на функцию createObject(int) тем, 
МР>                            // что у нее нет возвращаемого значения.
МР>


Ты сам себя загоняешь в заблуждение, пытаясь рассматривать это выражение как значение, возвращаемое функцией. В то время как никто никого здесь не возвращает — это прямое конструировние объекта имя типа которого задается конструктором. Это по смыслу то же самое что и
int obj = int(1024);

Нет здесь никакого возвращаемого значения, видишь?

Сам по себе конструктор — это всего лишь процедура, единственная задача которой сконструировать объкт в заданной области памяти. Указатель на эту область памяти передается конструктору неявно, и доступна эта область памяти внутри конструктора как this. Никаких значений он возвращать не может в принципе, потому что один и тот же конструктор может вызываться:

для создания rvalue объекта во временной области памяти:
const auto& obj = A(1024);
aFunction(A(1024) + A(42));

в статической или автоматической:
A obj(1024);

в динамической:
A* obj = new A(1024);

а также в любой неизвестной:
new(aPointer) A(1024);

И это все одна и та же процедура! Как она может что-то возвращать при таком разнообразии сценариев использования?