标准C ++输入输出流如何处理intXX_t类型?

时间:2017-01-09 18:04:29

标签: c++ c++11 language-lawyer

根据这些问题的答案Is overloading on all of the fundamental integer types is sufficient to capture all integers?所有基本类型的重载可能无法处理int8_t int64_t等类型。另根据文档std::ostream formatted output并且std::istream formatted input完全通过重载所有基本类型来实现。那么在平台上int8_t和其他人无法通过这种重载来处理C ++流将如何处理它们?会不会编译?标准库实现者是否必须提供其他未记录的方法?还有别的吗?

2 个答案:

答案 0 :(得分:4)

对于整数类型,[istream]定义:

basic_istream<charT,traits>& operator>>(bool& n);
basic_istream<charT,traits>& operator>>(short& n);
basic_istream<charT,traits>& operator>>(unsigned short& n);
basic_istream<charT,traits>& operator>>(int& n);
basic_istream<charT,traits>& operator>>(unsigned int& n);
basic_istream<charT,traits>& operator>>(long& n);
basic_istream<charT,traits>& operator>>(unsigned long& n);
basic_istream<charT,traits>& operator>>(long long& n);
basic_istream<charT,traits>& operator>>(unsigned long long& n);

如果is >> x是不在该列表中的整数类型,则x形式的任何代码都可能无法编译。

作为实现质量问题,提供扩展整数类型的实现可能会为这些类型添加operator>>重载。这是[member.functions] / 2允许的(如注释中的hvd所述),讨论标准库中的类:

  

实现可以在类中声明其他非虚拟成员函数签名:

     

[...]

     
      
  • 通过为成员函数名称添加成员函数签名。
  •   
     

对C ++标准库中描述的成员函数签名的调用就好像该实现没有声明其他成员函数签名一样。

这比一般规则更有力,即实施可能会添加不会违反合规程序的扩展。使用SFINAE的符合程序的行为可能会受到额外过载的影响。

对于输出,不在列表中的整数类型将可隐式转换为列表中的另一个整数类型。

答案 1 :(得分:1)

  

那么在平台上,int8_t和其他人无法通过这样的重载处理C ++流将如何处理它们?

就整数插入而言(运算符&lt;&lt;),它将根据标准C ++重载决策处理它们。扩展整数类型仍然是整数类型,并遵循隐式转换的规则以进行重载解析。

例如,int8_t可以上转换为足以容纳它的任何有符号整数类型。因此,如果int8_t是扩展整数类型而不是标准整数类型的别名,则可以根据重载决策规则将其上转换为其中一个标准整数类型。

对于整数提取(operator>>),这需要对实时整数进行非const引用,因此无法进行转换。因此,如果您没有提供operator>>重载的显式类型之一,则代码将无法编译。

最好的方法是,如果某个实现为这些类型添加了特别重载,但您不能依赖它。

应该注意的是,标准明确声明C ++ 17的新to_charsfrom_chars具有所有签名和无符号整数类型的重载(和{ {1}})。所以这包括扩展的整数类型。

  

它会无法编译吗?

对于插入,这取决于使用的类型。 char是安全的,因为有大于它的标准整数类型。它可能有不同的行为,但它会起作用。

相比之下,无法保证int8_tint_least64_t不大于intmax_t。隐式转换不能从大到小。在这些情况下,您会收到编译错误。

对于提取,如果与类型不匹配,则会出现编译失败。

  

标准库实现者是否必须提供其他未记录的方法?

没有。他们被允许这样做,但这不是你可以依赖的东西。

long long是一个特例,因为它可以如何实施。

int8_t作为字节大小类型和字符类型提供双重任务。因为它是一种字符类型,所以iostream操作将处理char的使用与处理整数类型的方式不同。使用整数,它将解析/生成整数字符串。对于一个角色,它假定你想要读一个角色。

char的有效实施可以是int8_t的别名,也可以是signed char的别名(如果已签名)。因此,将其与流操作一起使用将 treat it as a character

char的有效实现可以是扩展整数类型,与int8_t distinct 的类型。因此,根据重载决策规则,该值将被上转换为与标准值之一匹配的更大整数类型。因此,它将call one of these