Адреса экземпляров шаблонных функций по T и T const

Возможно ли, что в следующей настройке

template <typename T>
inline void id() {
//...
}

template <typename T>
bool check() {
return &id<T> == &id<T const>;
}

check вернусь true для некоторых T? Зависит ли это от того, что делается внутри id? Что стандарт должен сказать по этому поводу?

2

Решение

Конечно. Пытаться 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-квалификаторы игнорируются.

7

Другие решения

Я ожидаю, что функции не равны. Стандарт определенно делает не требовать, чтобы они были идентичными, хотя я подозреваю, что это позволяет им быть идентичными (я не совсем знаю, где искать соответствующий пункт).

0

По вопросам рекламы [email protected]