为什么使用 auto 的直接列表初始化被认为是不好的或不受欢迎的?

Why is direct-list-initialization with auto considered bad or not preferred?

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

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

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

但是说到 auto 说明符,我听说这样写会被认为是不好的或不受欢迎的,这是为什么呢?

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

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} 并让编译器删除副本。