为什么使用 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}
并让编译器删除副本。
我已经养成了使用直接列表初始化编写代码的习惯,因为它更有效,而且对防止隐式非常有用 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}
并让编译器删除副本。