C++11 数据类型混淆
C++11 data types confusion
我正在尝试为C++数据类型编写一个可靠的摘要,但我对新数据类型有些困惑。
正如我从C++数据类型的阅读中了解到的那样,char16_t
和char_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_t
和char32_t
定义为uint_least16_t
和uint_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不创建类型,只创建别名。
但是,当类型确实不同时,编译器会将两个版本视为两个不同的重载。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 构造智能点数据类型以及普通数据类型的通用方法
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- C++11 中是否有实际的 4 位整数数据类型
- C++11 数据类型混淆
- 在10^10到10^11之间的数字的数据类型应该是什么
- C++11 在map<key,value>中存储值(整数和字符串)的多种数据类型的最简单方法?