C23标准显然已经引入了使用“auto”关键字进行自动类型推断,see here,就像C11中一样。然而,似乎存在一些差异。
根据这里,https://en.cppreference.com/w/cpp/keyword/auto,在C11之后,auto
不再是C++中的存储持续时间说明符。
然而,我无法轻易找到C23的等效语句。在C23中,auto
**仍然是C中的存储类说明符吗?
在C23中还可以写int auto x = 1;
吗?
***但正如Andrew Henle在下面的评论中指出的那样,第二个问题是不同的:
我们还可以在C23中写float auto x = 1;
吗?
正如@AndrewHenle和@VladfromMoscow在standard document,6.7.1存储类说明符,第4段中所引用的
auto只能出现在文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现。
如果这个声明不在文件作用域中,那么这似乎不包括float auto x = 1;
的情况。
对此有何解释?
还有一个问题:这句话看起来很混乱,因为我们当然可以在没有“其他存储说明符”的情况下使用auto,不是吗?比如auto a = 1;
。
3条答案
按热度按时间31moq8wy1#
是的,
auto
仍然是C23中的存储类说明符:参见6.7.1 Storage-class specifiers:
*
auto
constexpr
extern
register
static
thread_local
typedef
j13ufse22#
在C23中,auto仍然是存储类说明符。
来自C 23(6.7.1存储类说明符)
语法
和
语义学
6存储类说明符指定标识符和声明的功能的各种属性:
4 thread_local不应出现在函数声明的声明说明符中。auto只能出现在具有文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现
whlutmcx3#
float auto x = 1;
是有效的,其含义与pre-C23中相同(这里的auto
与pre-C23中的auto
一样冗余)。工作草案中没有任何迹象表明情况可能并非如此。auto只能出现在文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现。
这并不包括函数范围内的
float auto x = 1;
。在此声明中,auto
仍然指定存储持续时间,因为:存储类说明符指定标识符和声明的功能的各种属性:
而
auto
的这个含义并没有被忽略,因为如果auto与另一个存储类说明符一起出现,或者它出现在文件范围的声明中,则在确定存储持续时间或链接时将忽略它
而
auto
* 不 * 指定应该推断类型,因为对于声明说明符不包含类型说明符的声明,将在6.7.9中讨论从初始化式推断类型的机制