2016-05-10 4 views
2

При использовании в качестве параметров шаблона являются целыми типами одинаковой длины и одинаковыми значениями равноценности, т. Е. Они создают один и тот же класс шаблона при использовании в качестве шаблона параметр? Какой пункт спецификации обрабатывает этот случай?целые типы одинаковой длины одинаковой длины в параметрах шаблона

Е.Г., рассмотрим я на архитектуру, на которой unsigned и unsigned long являются как 32-бит, тогда, например, vector<unsigned> быть другой класс как vector<unsigned long> или они будут рассматриваться в качестве одного типа?

+1

Вам понадобится около минуты, чтобы понять это, просто пытаясь скомпилировать 'std :: vector a; std :: vector b; B = A; '. Нет причин ждать, пока какой-нибудь незнакомец на stackoverflow.com ответит на простой вопрос, который можно выяснить самостоятельно. –

+1

@SamVarshavchik: Вопрос может логически иметь три ответа: иногда, всегда и никогда; тестирование могло бы устранить один, но остальные два остались бы. – supercat

ответ

2

Тип: Марки: unsigned int и unsigned long Гарантируются быть разными. Поясним это примечанием в стандарте:

Даже если реализация определяет два или более основных типов имеют такое же представление значения, они все-таки разные типы.

([basic.fundamental]/11)

В общем, два типа только то же самое, если один псевдоним к другому (т.е. , с typedef или using) или если оба псевдонимами к тому же типу.

Учитывая, что unsigned int и unsigned long различные типы, vector<unsigned int> и vector<unsigned long> также различные типы, даже если эти два класса имеют одинаковые макеты.

+0

Если причина, по которой ОП задается, заключается в том, чтобы выяснить, будет ли «шаблонный раздутый», вызванный двумя экземплярами, где этого достаточно, мы все еще не можем знать, основываясь на этой информации. Реализация может свернуть два экземпляра, если захочет - я почти уверен. –

0

Если вы делаете слепой тип-литье между разными целыми типами, то приведение будет работать иногда, но обязательно каждый раз. Это связано с тем, что разные типы имеют разные минимальные и максимальные значения. Кастинг типов будет разрешен большинством компиляторов, но они будут использовать правила, которые могут быть незнакомы, что приводит к потенциально неожиданному поведению. Лучше всего исследовать эти типы, а затем гарантировать, что любой написанный вами код, который преобразует их, предотвращает непредсказуемые результаты.

+0

К сожалению, даже в тех реализациях, где «int» и «long» имеют одинаковые представления во всех случаях, компилятору по-прежнему разрешено рассматривать операции с «int» и «long» как неточные по отношению друг к другу, тем самым переписывая «* intPtr = 5; long x = * longPtr; " как «long x = * longPtr; * intPtr = 5;». – supercat