T x(value)
обычно является лучшим выбором, потому что он непосредственно инициализирует x значением, тогда как T x = value
может создать временное в зависимости от типа значения.
Вы почти правы, лучший выбор - самый ясный синтаксис. Вот как они различаются:
Форма инициализации (с использованием скобок или =), как правило, незначительна, но имеет значение, когда инициализируемая сущность имеет тип класса ... [8.5 / 11]
struct A {
A(int) {}
};
struct B {
explicit B(int) {}
};
int main() {
{ A obj (42); } // succeeds
{ A obj = 42; } // succeeds
{ B obj (42); } // succeeds
{ B obj = 42; } // fails
}
Требуется неявное преобразование, поэтому такие вещи, как vector<int> v = 3;
терпят неудачу, но это выглядит неправильно в любом случае, верно? Любая копия скорее всего elided . Я не помню, чтобы это было узким местом во всем, что я написал, и я давно перестал беспокоиться об этом: просто используйте самый ясный синтаксис.
Хотя в особом случае, когда значение имеет тип T, я предполагаю, что выражение T x = value
всегда будет приводить к точно одному вызову конструктора копирования. Я прав?
Нет, вам не гарантируется, что копия ctor будет вызываться всегда, но она должна быть доступна. Например, в приведенном выше конкретном случае, когда value
является возвращаемым значением функции, стандарт явно разрешает удаление этих копий.