我已养成使用下面的直接列表初始化编写代码的习惯,因为它更有效,并且对于防止隐式narrowing非常有用:
int i {0};
string s {""};
char c {'a'};
bool b {false};
auto num {100}; // But this??
但是当谈到自动说明符时,我听说它被认为是坏的或不喜欢这样写,为什么会这样?
答案 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}
并让编译器忽略副本。