1

如果我运行:

#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's 相同类型的行为?

4

2 回答 2

7

这是语言规则,对可移植性至关重要。

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

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

例如,如果说两个重载,那将非常烦人

void foo(int f)

void foo(long f)

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

于 2016-12-23T16:14:02.827 回答
0

同样,这个程序:

#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

正如您所看到的,double并且long看起来长度相同,为什么它们不只是相同类型的 typedef?

于 2016-12-23T18:59:12.940 回答