Конструктор по умолчанию для аргументов ф-ции
От: ferrata  
Дата: 21.09.04 05:20
Оценка:
Hello, All!

У Александреску прочитал такую вещь. К сожалению не могу сейчас привести цитату дословно, но смысл сводится к следующему:
В соответствии со стандартом для аргументов функции компилятор не должен вызывать констукторы по умолчанию.
Может ли кто-нибудь прокомментировать это?

С уважением
np: Tobias Sammet's — Memory[paused]
Posted via RSDN NNTP Server 1.8
Re: Конструктор по умолчанию для аргументов ф-ции
От: itman itman.livejournal.com
Дата: 21.09.04 06:01
Оценка:
Здравствуйте, ferrata, Вы писали:

F>Hello, All!


F>У Александреску прочитал такую вещь. К сожалению не могу сейчас привести цитату дословно, но смысл сводится к следующему:

F>В соответствии со стандартом для аргументов функции компилятор не должен вызывать констукторы по умолчанию.
F>Может ли кто-нибудь прокомментировать это?

F>С уважением

F>np: Tobias Sammet's — Memory[paused]

а как ты себе представляешь вызво конструктора по умолчанию:
void f(some_type some_var = some_value) {
};

по идее если параметр передается по значение, и он "умолчальный", то должен работать конструктор компирования.
в принципе, может сначала отрабатываться конструктор по умолчанию, а потом оператор присваивания, то это попахивает идиотизмом и лишними накладными расходами. вот компилятор и запрещает, требуя видимо, чтобы сразу вызывался copy ctor.
Re[2]: Конструктор по умолчанию для аргументов ф-ции
От: MaximE Великобритания  
Дата: 21.09.04 06:54
Оценка:
itman wrote:

> Здравствуйте, ferrata, Вы писали:

>
> F>Hello, All!
>
> F>У Александреску прочитал такую вещь. К сожалению не могу сейчас привести цитату дословно, но смысл сводится к следующему:
> F>В соответствии со стандартом для аргументов функции компилятор не должен вызывать констукторы по умолчанию.
> F>Может ли кто-нибудь прокомментировать это?
>
> F>С уважением
> F>np: Tobias Sammet's — Memory[paused]
>
> а как ты себе представляешь вызво конструктора по умолчанию:
>
> void f(some_type some_var = some_value) {
> };
>


> в принципе, может сначала отрабатываться конструктор по умолчанию, а потом оператор присваивания, то это попахивает идиотизмом и лишними накладными расходами. вот компилятор и запрещает, требуя видимо, чтобы сразу вызывался copy ctor.


Для аргументов ф-ций применяется copy initialization. Это не значит, что формальный аргумент ф-ции сначала инициализируется по-умолчанию, а затем ему присваивается переданное значение. Это значит, что переданным в ф-цию значением инициализируется временный объект типа формального аргумента, а затем формальный аргумент инициализируется этим временным значением при помощи конструктора копирования.

Стандарт явно разрешает компиляторам трансформировать код и заменять copy initialization на direct initialization (и большинство компиляторов так и делают), в том случае если конструктор инициализации (не копирования) не explicit и коструктор копирования доступен (public). Подробности в стандарте п.8.5.14.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[3]: Конструктор по умолчанию для аргументов ф-ции
От: Кодт Россия  
Дата: 21.09.04 06:59
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Для аргументов ф-ций применяется copy initialization. Это не значит, что формальный аргумент ф-ции сначала инициализируется по-умолчанию, а затем ему присваивается переданное значение. Это значит, что переданным в ф-цию значением инициализируется временный объект типа формального аргумента, а затем формальный аргумент инициализируется этим временным значением при помощи конструктора копирования.


ME>Стандарт явно разрешает компиляторам трансформировать код и заменять copy initialization на direct initialization (и большинство компиляторов так и делают), в том случае если конструктор инициализации (не копирования) не explicit и коструктор копирования доступен (public). Подробности в стандарте п.8.5.14.


А так?
void foo(Type const& arg = Type());
Перекуём баги на фичи!
Re[4]: Конструктор по умолчанию для аргументов ф-ции
От: MaximE Великобритания  
Дата: 21.09.04 07:11
Оценка:
Кодт wrote:

> А так?

>
> void foo(Type const& arg = Type());
>


Формальный аргумент имеет имя arg, Type() — это всего лишь инициализатор. Для формального аргумента не вызывается конструктор по умолчанию.

Я думаю, что формальный аргумент, это то, что имел ввиду автор постинга под "аргумент ф-ции".

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re[3]: Конструктор по умолчанию для аргументов ф-ции
От: ferrata  
Дата: 21.09.04 12:03
Оценка:
Hello, MaximE!

M> [skipped] в том случае если конструктор инициализации (не

M> копирования) не explicit и коструктор копирования доступен (public).

Боюсь развести флейм, но хочется понять..
Что есть конструктор инициализации?

M> Подробности в стандарте п.8.5.14.


уже иду читать

С уважением
np: void
Posted via RSDN NNTP Server 1.8
Re[4]: Конструктор по умолчанию для аргументов ф-ции
От: MaximE Великобритания  
Дата: 21.09.04 12:25
Оценка:
ferrata wrote:

> M> [skipped] в том случае если конструктор инициализации (не

> M> копирования) не explicit и коструктор копирования доступен (public).
>
> Боюсь развести флейм, но хочется понять..
> Что есть конструктор инициализации?

Я так назвал те, которые не копирования

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.