Hello, All!
У Александреску прочитал такую вещь. К сожалению не могу сейчас привести цитату дословно, но смысл сводится к следующему:
В соответствии со стандартом для аргументов функции компилятор не должен вызывать констукторы по умолчанию.
Может ли кто-нибудь прокомментировать это?
С уважением
np: Tobias Sammet's — Memory[paused]
Posted via RSDN NNTP Server 1.8
Здравствуйте, 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.
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 YegorushkinPosted via RSDN NNTP Server 1.9 gamma
Здравствуйте, MaximE, Вы писали:
ME>Для аргументов ф-ций применяется copy initialization. Это не значит, что формальный аргумент ф-ции сначала инициализируется по-умолчанию, а затем ему присваивается переданное значение. Это значит, что переданным в ф-цию значением инициализируется временный объект типа формального аргумента, а затем формальный аргумент инициализируется этим временным значением при помощи конструктора копирования.
ME>Стандарт явно разрешает компиляторам трансформировать код и заменять copy initialization на direct initialization (и большинство компиляторов так и делают), в том случае если конструктор инициализации (не копирования) не explicit и коструктор копирования доступен (public). Подробности в стандарте п.8.5.14.
А так?
void foo(Type const& arg = Type());
Кодт wrote:
> А так?
> > void foo(Type const& arg = Type());
>
Формальный аргумент имеет имя arg, Type() — это всего лишь инициализатор. Для формального аргумента не вызывается конструктор по умолчанию.
Я думаю, что формальный аргумент, это то, что имел ввиду автор постинга под "аргумент ф-ции".
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9 gamma
Hello, MaximE!
M> [skipped] в том случае если конструктор инициализации (не
M> копирования) не explicit и коструктор копирования доступен (public).
Боюсь развести флейм, но хочется понять..
Что есть конструктор инициализации?
M> Подробности в стандарте п.8.5.14.
уже иду читать
С уважением
np: void
Posted via RSDN NNTP Server 1.8
ferrata wrote:
> M> [skipped] в том случае если конструктор инициализации (не
> M> копирования) не explicit и коструктор копирования доступен (public).
>
> Боюсь развести флейм, но хочется понять..
> Что есть конструктор инициализации?
Я так назвал те, которые не копирования
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9 gamma