Возможно ли, что в следующей настройке
template <typename T>
inline void id() {
//...
}
template <typename T>
bool check() {
return &id<T> == &id<T const>;
}
check
вернусь true
для некоторых T
? Зависит ли это от того, что делается внутри id
? Что стандарт должен сказать по этому поводу?
Конечно. Пытаться const int
или же int&
или же void()
,
Есть правило, что на высшем уровне const
классификаторы коллапс если вы получаете несколько из них через typedef
или аргумент шаблона, что означает check<int const>()
вернусь true
,
Тогда есть правило, которое игнорирует верхний уровень const
о вещах, с которыми он не работает, таких как ссылки или типы функций. Это означает check<int&>
а также check<int()>
вернусь true
,
§8.3.2 [dcl.ref] p1
Cv-квалифицированные ссылки плохо сформированы, за исключением случаев, когда cv-квалификаторы вводятся с помощью typedef (7.1.3) или аргумента типа шаблона (14.3), в этом случае cv-квалификаторы игнорируются.
а также
§4.4 [conv.qual] p3
[ Замечания: Типы функций (включая те, которые используются в указателе на типы функций-членов) никогда не квалифицируются cv (8.3.5). —Конечная записка ]
§8.5.3 [dcl.fct] p6
Эффект резюме-спецификатор-сл в объявлении функции это не то же самое, что добавление cv-квалификации поверх типа функции. В последнем случае cv-квалификаторы игнорируются.
Я ожидаю, что функции не равны. Стандарт определенно делает не требовать, чтобы они были идентичными, хотя я подозреваю, что это позволяет им быть идентичными (я не совсем знаю, где искать соответствующий пункт).