【问题标题】:C++11 data types confusionC++11 数据类型混淆
【发布时间】:2017-08-14 07:40:54
【问题描述】:
我正在尝试为 C++ 数据类型写一个可靠的摘要,但我对新的数据类型有些困惑。
据我阅读有关 C++ 数据类型的资料了解到,char16_t 和 char_32_t 是自 C++11 以来的基本数据类型和核心语言的一部分。
提到它们是不同的数据类型。
Q1:这里的“distinct”到底是什么意思?
Q2:为什么像int32_t 这样的intxx_t 类型族被选为不是基本数据类型?在选择它们而不是int 时,它们有什么好处?
【问题讨论】:
标签:
c++
c++11
types
char
int
【解决方案1】:
回答问题的第二部分:
固定大小的整数类型继承自 C,它们是 typedefs。决定将它们保留为typedefs 以保持兼容。请注意,C 语言没有重载函数,因此对“不同”类型的需求较低。
使用int32_t 的一个原因是您需要它的一个或多个必需属性:
宽度为正好 32 位的有符号整数类型
没有填充位,负值使用 2 的补码。
如果您使用int,for example 可能是 36 位并使用 1 的补码。
但是,如果您没有非常具体的要求,使用普通的int 就可以了。一个优点是int 将在所有系统上可用,而 36 位机器(或 24 位嵌入式处理器)可能根本没有任何int32_t。
【解决方案2】:
charXX_t 类型是在 N2249 中引入的。它们被创建为与 uintXX_t 不同的类型以允许重载:
将char16_t 定义为一个独特的新类型,它与uint_least16_t 具有相同的大小和表示形式。同样,将char32_t 定义为一个独特的新类型,它具有与uint_least32_t 相同的大小和表示形式。
[N1040 将char16_t 和char32_t 定义为uint_least16_t 和uint_least32_t 的typedef,这使得重载这些字符是不可能的。]
【解决方案3】:
回答您的问题 1:
不同类型意味着std::is_same<char16_t,uint_least16_t>::value等于false。
所以重载函数是可能的。
(不过,大小、符号和对齐方式没有区别。)
【解决方案4】:
表达“不同类型”的另一种方式是您可以为每种类型创建两个重载函数。例如:
typedef int Int;
void f(int) { impl_1; }
void f(Int) { impl_2; }
如果您尝试编译包含这两个函数的代码 sn-p,编译器将抱怨 ODR 违规:您尝试重新定义相同的函数两次,因为它们的参数相同。那是因为typedefs 不创建类型,只是创建别名。
但是,当类型真正不同时,编译器会将两个版本视为两个不同的重载。