【问题标题】:Is there any difference between auto and __auto_type?auto 和 __auto_type 之间有什么区别吗?
【发布时间】:2020-11-15 16:35:25
【问题描述】:

我已经在 C 中使用 __auto_type 有一段时间了,我想知道它是否与 C++ 中的 auto 有什么不同。它们的实施方式不同吗?

我已经尝试搜索这个,但它没有产生任何结果,因为在 C++ 中搜索 __auto_type 会返回关于 auto 的文章。感觉就像一个被遗忘的关键字。

【问题讨论】:

  • __auto_type 在我的 C++ 代码中无法编译。
  • 这是一个 GNU 扩展 gcc.gnu.org/onlinedocs/gcc/Typeof.html - 仅限 C,是的
  • @StoryTeller-UnslanderMonica:你想把它作为答案发布吗?

标签: c++ c keyword type-inference auto


【解决方案1】:

正如 StoryTeller 所说,它是 C 模式下的 GCC 扩展。它在 C++ 中不起作用

在 GNU C 而不是 GNU C++ 中,您还可以将变量的类型声明为 __auto_type。在这种情况下,声明必须只声明一个变量,其声明符必须只是一个标识符,声明必须被初始化,变量的类型由初始化器确定;直到初始化器之后,变量的名称才在范围内。 (在 C++ 中,您应该为此使用 C++11 auto。)使用__auto_type,上面的“最大”宏可以写成:

   #define max(a,b) \
     ({ __auto_type _a = (a); \
     __auto_type _b = (b); \
     _a > _b ? _a : _b; })

https://gcc.gnu.org/onlinedocs/gcc/Typeof.html

如您所见,它与 C++ 中的 auto 完全相同,因为

  • 它只能用于声明单个变量,而C++中的auto可以用于声明多个变量,如auto i = 0, *p = &i;
  • 它不能出现在函数(或 lambda)的返回类型或参数中,如 auto f();void f(auto);

decltype(auto)的情况下它也不能替换auto,或者像const auto& i = expr;一样使用,因为C中没有这样的功能

不过后来 Clang 采用了这个关键字,在 C++ 中也支持它,它auto完全一样,甚至可以用于 C++98

此实现与 GCC 的不同之处在于还支持 C++ 中的__auto_type, 将其视为与auto 相同。我看不出有什么好的理由不这样做,因为 否则打算从两种语言中使用的标题不能使用它(你 可以使用扩展为 __auto_typeauto 的定义,具体取决于 语言,但是 C++ pre-11 被破坏了)。

Add support for GCC's '__auto_type' extension.

Demo for Clang++

Objective C也支持

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 2012-01-08
    • 1970-01-01
    • 2013-09-13
    • 2017-04-05
    • 2014-09-18
    • 2015-06-14
    • 2011-05-23
    • 2011-02-15
    相关资源
    最近更新 更多