Нет - просто например, если у вас есть T == (float | double | long double), ваш operator==
не будет работать правильно. Два NaN никогда не должны сравниваться как равные, даже если они имеют одинаковую битовую комбинацию (на самом деле, один из распространенных методов обнаружения NaN - это сравнение числа с самим собой - если оно не равно самому себе, это NaN). Аналогично, два числа с плавающей запятой со всеми битами в их показателях степени, установленными в 0, имеют значение 0,0 (точно) независимо от того, какие биты могут быть установлены / сброшены в значении.
Ваш operator<
имеет еще меньше шансов на правильную работу. Например, рассмотрим типичную реализацию std::string
, которая выглядит примерно так:
template <class charT>
class string {
charT *data;
size_t length;
size_t buffer_size;
public:
// ...
};
При таком упорядочении членов ваш operator<
выполнит сравнение на основе адресов буферов, в которых строки хранят свои данные. Если, к примеру, он был записан сначала с элементом length
, то при сравнении вы будете использовать длины строк в качестве первичных ключей. В любом случае, он не будет делать сравнение, основанное на фактическом содержимом строки, потому что он будет когда-либо смотреть только на значение указателя data
, а не на то, на что он указывает, на что вы очень хочу / нужен.
Редактировать: Что касается заполнения, нет требования, чтобы содержимое заполнения было одинаковым. Теоретически также возможно, чтобы заполнение представляло собой какое-то представление ловушки, которое вызовет сигнал, сгенерирует исключение или что-то в этом порядке, если вы даже попытаетесь посмотреть на него вообще. Чтобы избежать такого представления ловушек, вам нужно использовать что-то вроде приведения, чтобы рассматривать его как буфер unsigned char
s. memcmp
может сделать это, но с другой стороны, это не может ...
Также обратите внимание, что одинаковые типы объектов не обязательно означают использование одинакового выравнивания элементов. Это распространенный метод реализации, но для компилятора также вполне возможно сделать что-то вроде использования различных выравниваний в зависимости от того, как часто он «думает», что будет использоваться конкретный объект, и включить какой-либо тег в * 1023. * объект (например, значение, записанное в первый байт заполнения), который сообщает выравнивание для этого конкретного экземпляра. Аналогично, он может разделять объекты по (например) адресу, поэтому объект, расположенный по четному адресу, имеет 2-байтовое выравнивание, по адресу, кратному четырем, имеет 4-байтовое выравнивание и т. Д. (Это не может быть используется для типов POD, но в противном случае все ставки отключены).
Ничего из этого не является вероятным или распространенным, но в стандарте я не могу придумать ничего такого, что бы запрещало их.