为什么直接列表初始化与auto被认为是坏的或不是首选的?

时间:2015-04-27 08:38:53

标签: c++ c++11 initialization auto type-deduction

我已养成使用下面的直接列表初始化编写代码的习惯,因为它更有效,并且对于防止隐式narrowing非常有用:

int i {0};
string s {""};
char c {'a'};
bool b {false};

auto num {100}; // But this??

但是当谈到自动说明符时,我听说它被认为是坏的或不喜欢这样写,为什么会这样?

1 个答案:

答案 0 :(得分:11)

以下是使用该语法失败的示例:

struct Foo{};

void eatFoo (const Foo& f){}

int main() {
    Foo a;
    auto b{a};
    eatFoo(b);
}

您可能会认为这很好:b应该是Foo并传递给eatFoo。不幸的是,这会导致以下编译器错误:

prog.cpp:11:10: error: invalid initialization of reference of type 'const Foo&' from expression of type 'std::initializer_list<Foo>'
  eatFoo(b);

如您所见,b实际上是std::initializer_list<Foo>类型。在这种情况下,当然不是我们想要的。如果我们将其更改为auto b = a,这样可以正常工作。然后,如果我们仍然想要使用auto,但明确说明类型,我们可以将其更改为auto b = Foo{a}并让编译器忽略副本。