Когда два указателя будут сравниваться равными?
Согласно 5.10 / 1:
== (равно) и! = (Неравно) операторы имеют те же семантические ограничения, преобразования и тип результата, что и реляционные операторы, за исключением их более низкого приоритета и истинностного результата.[Примечание: a<b
== c<d
истинно, когда a<b
и c<d
имеют одно и то же значение истинности.- примечание конца] Указатели одного типа (после преобразования указателей) можно сравнивать на равенство.Два указателя одного типа сравниваются равными, если и только если они оба равны нулю, оба указывают на одну и ту же функцию, или оба представляют один и тот же адрес (3.9.2).
Являются ли foo<int>()
и foo<char>()
одинаковыми функциями?
Согласно 14.4 / 1:
Два идентификатора шаблона относятся к одному и тому же классу илифункция, если
- их имена шаблонов, идентификаторы операторов или литералы операторов ссылаются на один и тот же шаблон, а
- их аргументы шаблона соответствующего типа:один и тот же тип и
- соответствующие им нетипизированные аргументы шаблона целочисленного типа или типа перечисления имеют идентичные значения, а
- соответствующие им нетипизированные аргументы шаблона типа указателя ссылаются на одно и то жевнешний объект или функция, либо оба являются нулевым значением указателя, а
- их соответствующие нетипизированные аргументы шаблона типа указатель на член относятся к одному и тому же члену класса или оба являются нулевым значением указателя на член и
- соответствующие им нетипизированные аргументы шаблона ссылочного типа ссылаются на тот же внешний объект или функцию, а
- соответствующие им аргументы шаблона ссылаются на тот же шаблон.
Так что, очевидно, foo<int>()
и foo<char>()
не являются одной и той же функцией.
Так что &foo<int>()
и &foo<char>()
не должны сравниваться одинаково, независимо от того, какая оптимизация выполнена.
РЕДАКТИРОВАТЬ:
Как упомянуто @SergeDundich в комментарии, 14,4 / 1 использовал if
вместо if and only if
, что дает нет гарантию того, foo<int>()
и foo<char>()
- это одна и та же функция или нет.В других частях спецификации часто используется if and only if
.
Я не нашел никакого объяснения этому в спецификации.Однако в примерах я могу найти это:
template<class T, void(*err_fct)()> class list { /* ... */ };
list<int,&error_handler1> x1;
list<int,&error_handler2> x2;
list<int,&error_handler2> x3;
list<char,&error_handler2> x4;
объявляет x2 и x3 одинакового типа.Их тип отличается от типов x1 и x4.
EDIT2:
if
используется вместоif and only if
, поскольку такая ситуация существует: (Пример из 14.5.7 / 2)
template<class T> struct Alloc { /* ... */ };
template<class T> using Vec = vector<T, Alloc<T>>;
Vec<int> v; // same as vector<int, Alloc<int>> v;
Vec<int>
и vector<int, Alloc<int>>
имеют много различий, но все еще одного типа.
Однако, что касается foo<int>()
и foo<char>()
, их подписи разные.Разные подписи должны предоставлять им разные функции.
Благодаря @ JohannesSchaub-litb.