Если я бегу:
#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;
}
на моей машине (и на колиру) я получить:
sizeof(long) = 8
sizeof(long long) = 8
std::is_same<long, long long>::value = false
И это не просто std::is_same<>
; переводчики, ожидающие инстанцирования для int64_t
потерпеть неудачу, потому что я скомпилировал только для int
а также long long int
в другом переводчике, несмотря на то, что все происходит на одной машине.
Почему эти типы не одинаковы? Я имею в виду, демонстрируя поведение, как вы бы из typedef
того же типа?
Это правило языка и важно для мобильности.
int
, long
, а также long 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
Как вы видете, double
а также long
Похоже, они имеют одинаковую длину, почему они не являются просто определениями типов одного типа?