C++11 数据类型混淆

C++11 data types confusion

本文关键字:数据类型 C++11      更新时间:2023-10-16

我正在尝试为C++数据类型编写一个可靠的摘要,但我对新数据类型有些困惑。

正如我从C++数据类型的阅读中了解到的那样,char16_tchar_32_t是基本的数据类型,也是自C++11以来核心语言的一部分。

提到它们是不同的数据类型。

Q1: 这里的"区别"到底是什么意思?

Q2:为什么选择像int32_t这样的intxx_t类型族不是基本数据类型?选择它们而不是int它们时如何有益?

回答问题的第二部分:

固定大小的整数类型继承自 C,其中它们typedef s。决定将它们保留为typedef以兼容。请注意,C 语言没有重载函数,因此对"不同"类型的需求较低。

使用 int32_t 的一个原因是您需要其一个或多个必需属性:

宽度正好为 32 位的有符号整数类型 没有填充位,并使用 2 的补码作为负值。

例如,如果您使用int它可能是 36 位并使用 1 的补码。

但是,如果您没有非常具体的要求,使用普通int就可以了。一个优点是int将在所有系统上可用,而 36 位计算机(或 24 位嵌入式处理器(可能根本没有任何int32_t

charXX_t类型是在 N2249 中引入的。它们被创建为与 uintXX_t 不同的类型,以允许重载:

char16_t定义为不同的新类型,其大小和表示形式与uint_least16_t 相同。同样,将char32_t定义为一个独特的新类型,其大小和表示形式与uint_least32_t 相同。

[N1040将char16_tchar32_t定义为uint_least16_tuint_least32_t的typedef,这使得这些字符的重载变得不可能。

要回答您的问题 1:

非重复类型表示std::is_same<char16_t,uint_least16_t>::value等于 false

因此,重载函数是可能的。

(不过,在大小、符号和对齐方式方面没有区别。

表示"不同类型"的另一种方法是,您可以为每个类型创建两个重载函数。例如:

typedef int Int;
void f(int) { impl_1; }
void f(Int) { impl_2; }

如果您尝试编译包含这两个函数的代码片段,编译器将抱怨 ODR 违规:您尝试重新定义同一函数两次,因为它们的参数相同。这是因为typedef s不创建类型,只创建别名。

但是,当类型确实不同时,编译器会将两个版本视为两个不同的重载。