Здравствуйте, Bell, Вы писали:
W>>Вот такая конструкция на моей системе работает корректно: W>>
W>>template <int64 n>
W>>struct X
W>>{
W>> enum { result = n };
W>>};
W>>
W>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?
B>Да.
B>
B>7.2/5
B>The underlying type of an enumeration is an integral type that can represent all the enumerator values
B>defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
B>for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
B>cannot fit in an int or unsigned int.
B>...
В реальности VC 7, VC 8 и VC 9 этот пункт стандарта нарушают. У них даже ворнинг специальный на эту тему есть — C4341.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Wody, Вы писали:
W>Вот такая конструкция на моей системе работает корректно: W>
W>template <int64 n>
W>struct X
W>{
W> enum { result = n };
W>};
W>
W>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?
Да.
7.2/5
The underlying type of an enumeration is an integral type that can represent all the enumerator values
defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
cannot fit in an int or unsigned int.
...
W>>template <int64 n>
W>>struct X
W>>{
W>> enum { result = n };
W>>};
W>>
W>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?
B>Да.
B>
B>7.2/5
B>The underlying type of an enumeration is an integral type that can represent all the enumerator values
B>defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
B>for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
B>cannot fit in an int or unsigned int.
B>...
Откуда следует, что в X<15>::result будет 8 байт? Мне кажется, что там будет <= sizeof(int) на основании процитированного 7.2/5.
B>>7.2/5
B>>The underlying type of an enumeration is an integral type that can represent all the enumerator values
B>>defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
B>>for an enumeration except that the underlying type shall not be larger than int unless the value of an enumerator
B>>cannot fit in an int or unsigned int.
B>>...
U>Откуда следует, что в X<15>::result будет 8 байт?
Этого никто не утверждал
U>Мне кажется, что там будет <= sizeof(int) на основании процитированного 7.2/5.
В данном случае именно так — ведь внутренний тип перечисления определяется исходя из значений элементов перечисления.
B>Этого никто не утверждал
Виноват =\
А что же тогда означает слово "Да"? Или я вопрос не понял.
W>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?
B>Да.
Здравствуйте, uzhas, Вы писали:
B>>Этого никто не утверждал U>Виноват =\ U>А что же тогда означает слово "Да"? Или я вопрос не понял.
W>>>Могу я ожидать, что в компиляторах, где sizeof(long long int) = 8 в result будет всегда попадать именно 8 байт, а не 4?
B>>Да.
Я понял вопрос следующим образом: влезет ли в result значение, не представимое интегральным типом с размером 4 байта (int на многих платформах). Стандарт говорит, что в зависимости от значений перечисления будет использоваться тот тип, который позволит отобразить все эти значения.
Вот пример для иллюстрации:
template <long long n>
struct X
{
enum { result = n };
};
int main()
{
int arr1[sizeof(long long) == 8 ? 1 : -1] = {0};//Ok, тип long long имеет размер 8int arr2[sizeof(X<15>::result) == 8 ? 1 : -1] = {0};//Error - значение 15 представимо в int, и внутренним типом перечисления выбирается intint arr3[sizeof(X<15>::result) == 4 ? 1 : -1] = {0};//Okconst long long ll = 1024*1024;
int arr4[sizeof(X<ll*ll>::result) == 8 ? 1 : -1] = {0};//Ok а вот тут уже внутренний тип перечисления - это long longreturn 0;
}