Другой вопрос на C++, я пытаюсь выяснить, каковы эффекты использования «=» при построении объектов. Рассмотрите:Эффекты использования «=» в построении объекта
class Foo {
private:
int bar;
int baz;
public:
Foo(int bar, int baz)
:bar(bar), baz(baz) {}
};
int main() {
Foo foo1{4, 2};
Foo foo2 = {4, 2};
Foo foo3 = Foo{4, 2}; // I prefer this one for aesthetic reasons.
return 0;
}
В чем отличия, и какие из них следует придерживаться как наилучшая практика?
Кроме того, пока мы находимся на тему лучших практик, я слышу, что добавление explicit
к конструкторам - это хорошая идея из-за странного поведения с неявными преобразованиями. Поэтому я добавил explicit
конструктору Foo
:
public:
explicit Foo(int bar, int baz)
:bar(bar), baz(baz) {}
Вдруг это:
Foo foo2 = {4, 2};
Не удается скомпилировать с ошибкой:
error: chosen constructor is explicit in copy-initialization
Почему?
Две отличия, которые имеют значение: 1) Как вы видели, инициализация копирования не работает с явными конструкторами. 2) 'auto' выводит' std :: initializer_list' по-разному между копией и прямой инициализацией. В остальном он становится спорным в C++ 17. – ildjarn
'Foo foo3 = Foo {4, 2}; // Я предпочитаю это. «Я понятия не имею, почему. Понятно, что это предполагает совершенно бессмысленную дополнительную копию, хотя на самом деле хороший оптимизирующий компилятор отменит вашу ошибку. Но это просто выглядит многословным и уродливым. Зачем писать больше, чем нужно, когда это избыточно?'Foo foo {4, 2};' превосходит. –
«Я слышу добавление явного к конструкторам ...» - помимо того, что я был ужасно одевающимся, сделал невменяемый автор, где бы вы ни слышали, что упоминаете * почему * они считают это хорошей идеей? Вы согласны, не согласны или просто не понимаете этого оправдания? Наконец, [это описание 'explicit'] (http://en.cppreference.com/w/cpp/language/explicit) заслуживает рассмотрения. – WhozCraig