gpt4 book ai didi

c++ - 为什么必须包含 才能使用 auto?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:37 24 4
gpt4 key购买 nike

已经有类似的question关于 SO,但我想强调 braced-init-lists 的另一个方面。请考虑以下事项:

auto x = {1}; //(1)

除非标题 <initializer_list>,否则这是错误格式 (8.5.4/2)已经包括了。但为什么?标准说,模板 std::initializer_list不是预定义的。这是否意味着声明 (1) 引入了一种新类型?在所有其他情况下,auto可以使用如

auto y = expr;

哪里expr是一个表达式,自动推导的类型已经存在。另一方面,从逻辑的角度来看,编译器必须为结构 {1} 分配一个隐式类型。 ,为此 std::initializer_list是另一个名字。但是在声明(1)中我们不想命名这个类型。那么为什么必须包含此 header 。 nullptr 也有类似的情况。 .它的类型隐含地存在,但要明确地命名它,你必须包括 <cstddef> .

最佳答案

这不一样。 std::nullptr_t 的规则和 std::initializer_list实际上是不同的。

std::nullptr_t只是内置类型的 typedef。它的定义是

namespace std {
using nullptr_t = decltype(nullptr);
}

无论是否包含标题,类型都存在。

std::initializer_list是类模板,而不是预定义类型。它真的不存在,除非你包含定义它的标题。特别是初始化列表 { 1 }没有类型 std::initializer_list<int> ;它根本没有类型,因为它不是表达式。 (初始化列表是特殊的语法结构,不能出现在表达式可以出现的任何地方。)

std::initializer_list只是略显特殊。首先,对于如何初始化 std::initializer_list 有特殊的规则。来自初始化列表语法(分配一个数组并让对象引用它)。但是,这需要 std::initializer_list首先要定义。

第二个特例是auto类型推导。这里也有一个特殊的规则。但同样,这并不意味着编译器会自动定义类型;这只是意味着它会识别它。

关于c++ - 为什么必须包含 <initializer_list> 才能使用 auto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17105849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com