何时包括内置类型和运算符的标题?

何时应包含内置类型的标头?

  • <new>代表new(似乎确实需要复杂的重载);可以使用它。
  • (编辑:错误的示例(请参见答案))<typeinfo> for std::type_info;只需使用typeid运算符
  • 即可获取
  • (编辑:错误的示例(请参见答案))<initializer_list> for std::initizlizer_list;它只是auto l = {1,2,3};的结果或for (int i : {1,3}) {}中的临时结果
  • <cstddef>的{​​li> <cstdio> / <cstring> / <ctime> / std::size_t;它可以由运算符sizeof valsizeof(Type)的结果给出
  • <cstddef>代表std::nullptr_tdecltype(nullptr)
  • <cstddef>代表std::ptrdiff_tdecltype(std::declval<int *>() - std::declval<int *>())
  • <tuple>获取结构化绑定的某些功能
  • 也许是其他人

在某些情况下,必须包含相应的标头吗?

qyrwj 回答:何时包括内置类型和运算符的标题?

严格来说,并非所有示例的行为都像您期望的那样。例如

  

[expr.typeid]

     

6如果在使用之前没有包含标题<typeinfo>   typeid,程序格式错误。

     

[dcl.init.list]

     

2 ...模板std​::​initializer_­list尚未预定义;如果   标头<initializer_­list>在使用之前不包括在内   std​::​initializer_­list-甚至是类型为   未命名-程序格式错误。

所以马上有两个例子。而且可以肯定,例如,无需包含 some 标头

using size_t    = decltype(sizeof(0));
using nullptr_t = decltype(nullptr);

但是,总的来说,要完全确定我们得到明确定义的结果的方法是,为标准类型包括正确的标头。

,
  

在某些情况下,必须包含相应的标头吗?

我不是语言律师,C ++ 11对我来说很难掌握(请参阅n3337),但是在诸如GCCClang之类的实现中,标准标头可以并且通常确实包含编译器特有的技巧,例如#pragmafunction attributesbuiltins。 今天,在2019年底,GCC至少在<cstdarg>中使用了这些技巧,实际上在许多其他情况下(例如,在最近的Debian上尝试grep -rn __attribute__ /usr/lib/gcc/x86_64-linux-gnu/8/)。

我的理解是,系统中甚至可能没有标准标头作为文件存在。编译器内部可能是不可思议的,专门处理#include <map>来更改编译器的状态。但是,我不知道在2019年会有编译器这样做。据传言,VisualAge在上个世纪是这样做的。

因此,我认为使用标准标头时必须包含这些标头。

本文链接:https://www.f2er.com/2841466.html

大家都在问