【问题标题】:C++11 data types confusionC++11 数据类型混淆
【发布时间】:2017-08-14 07:40:54
【问题描述】:

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

据我阅读有关 C++ 数据类型的资料了解到,char16_tchar_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 的补码。

    如果您使用intfor 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_tchar32_t 定义为uint_least16_tuint_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 不创建类型,只是创建别名。

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

          【讨论】:

            猜你喜欢
            • 2017-12-24
            • 2011-02-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多