如果在我的机器上 sizeof(long) == sizeof(long long),为什么它们不是同一类型?



如果我运行:

#include <type_traits>
#include <iostream>
int main()
{
    std::cout << "sizeof(long) = " << sizeof(long) << "n";
    std::cout << "sizeof(long long) = " << sizeof(long long) << "n";
    std::cout << "std::is_same<long, long long>::value = " 
        << std::boolalpha << std::is_same<long, long long>::value 
        << "n";
    return 0;
}

在我的机器上(和coliru),我得到:

sizeof(long) = 8
sizeof(long long) = 8
std::is_same<long, long long>::value = false

,它不仅仅是 std::is_same<>;翻译单元期望int64_t实例化失败,因为我仅在另一台转换单元中为intlong long int编译,尽管它们都在同一台计算机上进行。

为什么这些类型不一样?我的意思是,表现出相同类型的typedef的行为?

这是语言规则,对于便携性至关重要。

intlonglong long都被语言视为不同的类型,即使它们具有相同数量的字节和补充方案。

这是故意的。这意味着您可以编写可以在类型大小变化的不同平台上编译的代码。

例如,如果说两个过载

,那将非常烦人
void foo(int f)

void foo(long f)

在一个平台上被视为相同的功能,另一个平台上的重载不同。

同样,此程序:

#include <type_traits>
#include <iostream>
int main()
{
    using ::std::cout;
    using ::std::is_same;
    using ::std::boolalpha;
    cout << "sizeof(long) = " << sizeof(long) << "n";
    cout << "sizeof(long long) = " << sizeof(long long) << "n";
    cout << "sizeof(double) = " << sizeof(double) << "n";
    cout << "::std::is_same<long, long long>::value = " 
        << boolalpha << is_same<long, long long>::value 
        << "n";
    std::cout << "::std::is_same<long, double>::value = " 
        << boolalpha << is_same<long, double>::value 
        << "n";
    return 0;
}

输出以下内容:

sizeof(long) = 8
sizeof(long long) = 8
sizeof(double) = 8
::std::is_same<long, long long>::value = false
::std::is_same<long, double>::value = false

如您所见,doublelong似乎是相同的长度,为什么它们不只是相同类型的Typedef?

相关内容

  • 没有找到相关文章

最新更新