C23 auto与C++11 auto

3j86kqsm  于 2023-05-16  发布在  其他
关注(0)|答案(3)|浏览(271)

C23标准显然已经引入了使用“auto”关键字进行自动类型推断,see here,就像C11中一样。然而,似乎存在一些差异。
根据这里,https://en.cppreference.com/w/cpp/keyword/auto,在C
11之后,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;

31moq8wy

31moq8wy1#

是的,auto仍然是C23中的存储类说明符:
参见6.7.1 Storage-class specifiers

*auto

  • constexpr
  • extern
  • register
  • static
  • thread_local
  • typedef
j13ufse2

j13ufse22#

在C23中,auto仍然是存储类说明符。
来自C 23(6.7.1存储类说明符)
语法

语义学
6存储类说明符指定标识符和声明的功能的各种属性:

  • 存储持续时间(块范围内的静态、thread_local、auto、register),
    4 thread_local不应出现在函数声明的声明说明符中。auto只能出现在具有文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现
whlutmcx

whlutmcx3#

float auto x = 1;是有效的,其含义与pre-C23中相同(这里的auto与pre-C23中的auto一样冗余)。工作草案中没有任何迹象表明情况可能并非如此。
auto只能出现在文件范围的标识符的声明说明符中,或者如果要从初始化器推断类型,则与其他存储类说明符沿着出现。
这并不包括函数范围内的float auto x = 1;。在此声明中,auto仍然指定存储持续时间,因为:
存储类说明符指定标识符和声明的功能的各种属性:

  • 存储持续时间(块范围内的静态、thread_local、auto、register),

auto的这个含义并没有被忽略,因为
如果auto与另一个存储类说明符一起出现,或者它出现在文件范围的声明中,则在确定存储持续时间或链接时将忽略它
auto * 不 * 指定应该推断类型,因为
对于声明说明符不包含类型说明符的声明,将在6.7.9中讨论从初始化式推断类型的机制

相关问题