Здравствуйте, Eugene Sh, Вы писали:
ES>Первый вариант выглядит лучше. А с точки зрения быстродействия разницы нет — в обоих случаях вызовется конструктор копирования.
Prefer using the form "T t(u);" instead of "T t = u;" where possible. The former usually works wherever the latter works, and has other advantages—for example, it can take multiple parameters.
Здравствуйте, igna, Вы писали:
ES>>Первый вариант выглядит лучше. А с точки зрения быстродействия разницы нет — в обоих случаях вызовется конструктор копирования.
I>
I>Prefer using the form "T t(u);" instead of "T t = u;" where possible. The former usually works wherever the latter works, and has other advantages—for example, it can take multiple parameters.
I>Ты с этим не согласен или считаешь инициализацию std::complex особым случаем? Почему?
Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен. А упомянутое преимущество "может принимать несколько параметров" ИМХО несколько надумано — никто не мешает записать "T t = T(u1, u2)" Понятно, что разница между инициализацией копированием и прямой инициализацией есть, но в абсолютном большинстве случаев это совершенно несущественно.
Здравствуйте, Bell, Вы писали:
B>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.
Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?
Здравствуйте, igna, Вы писали:
B>>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.
I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?
Если у меня не возникает ощущения дискомфорта, то я использую вариант с "=".
При работе с shared_ptr, например, использую вариант со скобочками, со строками — тоже. Класс complex использовать не приходилось, но первое ощущение — использовал бы вариант с "=".
В общем для меня это в большей степени субъективный выбор.
Ну а если есть подозрения на проблемы с эффективностью — так на это есть профайлер.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Bell, Вы писали:
B>>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.
I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?
Здравствуйте, Bell, Вы писали:
B>Если у меня не возникает ощущения дискомфорта, то я использую вариант с "=". B>При работе с shared_ptr, например, использую вариант со скобочками, со строками — тоже. Класс complex использовать не приходилось, но первое ощущение — использовал бы вариант с "=". B>В общем для меня это в большей степени субъективный выбор.
Твое счастье. Я формалист, мне хотелось бы алгоритм выбора формализовать. Судя по книгам самого Саттера, давшего рекомендацию использовать "T t(u);", он сам не придерживается своей рекомендации буквально, мог бы и рекомендацию эту самую поточнее сформулировать, встроенные типы там исключить, может что-нибудь еще.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Bell, Вы писали:
B>>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.
I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?
У shared_ptr я писал = везде, где можно, и часть кода сломалось, когда конструктор, принимающий auto_ptr внезапно стал explicit в 1.39.
С другой стороны, теперь конструирование shared_ptr через = можно использовать, чтобы подчеркнуть именно общее владение, а не передачу владения.
Здравствуйте, igna, Вы писали:
B>>Если у меня не возникает ощущения дискомфорта, то я использую вариант с "=". B>>При работе с shared_ptr, например, использую вариант со скобочками, со строками — тоже. Класс complex использовать не приходилось, но первое ощущение — использовал бы вариант с "=". B>>В общем для меня это в большей степени субъективный выбор.
I>Твое счастье.
Фууух, пронесло
I>Я формалист, мне хотелось бы алгоритм выбора формализовать. Судя по книгам самого Саттера, давшего рекомендацию использовать "T t(u);", он сам не придерживается своей рекомендации буквально, мог бы и рекомендацию эту самую поточнее сформулировать, встроенные типы там исключить, может что-нибудь еще.
Ну, может быть что-то вроде этого: если Вы боитесь создания лишнего временного объекта — используйте вариант со скобками.
Здравствуйте, Bell, Вы писали:
B>Ну, может быть что-то вроде этого: если Вы боитесь создания лишнего временного объекта — используйте вариант со скобками.
Может. А может еще проще, "используйте вариант со скобками" и все. Например:
int sum(int const a[], std::size_t const a_length)
{
int sum(0);
int const* const a_end(a + a_length);
for (int const* p(a); p < a_end; ++p)
sum += *p;
return sum;
}
Всюду, где возможно, я предпочитаю запись вида T x = y; — т.е. copy-initialization. Тем самым показывается использование неявного преобразования y к T, а значит, и родство между x и y — а именно: сущность y может быть использована там, где ожидается сущность типа T.
Здравствуйте, Николай Ивченков, Вы писали:
НИ>Всюду, где возможно, я предпочитаю запись вида T x = y; — т.е. copy-initialization. Тем самым показывается использование неявного преобразования y к T, а значит, и родство между x и y — а именно: сущность y может быть использована там, где ожидается сущность типа T.
С мнением Саттера ты конечно знаком:
Prefer using the form "T t(u);" instead of "T t = u;" where possible. The former usually works wherever the latter works, and has other advantages—for example, it can take multiple parameters.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, blackhearted, Вы писали:
B>>Со std::string самое интересное различие выходит
I>С std::string::string(const string&) или с std::string::string(const char*)?