В следующем примере (попробуйте онлайн) добавление тривиального ограничения требует true достаточно для выбора правильной перегрузки, когда аргумент имеет тип int, но недостаточно, когда это зависимый тип. И GCC, и Clang показывают это.
Мое единственное предположение: использование зависимого имени приводит к тому, что при разрешении перегрузки они считаются равными, но единственное, что я нашел в CPPReference, это:< /p>
При определении эквивалентности двух зависимых выражений учитываются только задействованные зависимые имена, а не результаты поиска имен (ссылка).
Это подсказывает мне, что они будут считаться равными по рангу, и тогда вступят в силу концептуальные правила - как это происходит в случае int?
#include
template requires true
void Overloaded(int const&)
{ std::puts("int: concept"); }
template
void Overloaded(int const&)
{ std::puts("int: non-concept"); }
template requires true
void Overloaded(typename T::Arguments const&)
{ std::puts("concept"); }
template
void Overloaded(typename T::Arguments const&)
{ std::puts("non-concept"); }
int main() {
struct HasArgs {
struct Arguments {};
};
Overloaded(int{}); // ok
Overloaded(HasArgs::Arguments{}); // error
}
Ошибка (только отчасти полезная):
:27:24: error: call of overloaded 'Overloaded(main()::HasArgs::Arguments)' is ambiguous
27 | Overloaded(HasArgs::Arguments{}); // error
:13:6: note: candidate: 'void Overloaded(const typename T::Arguments&) [with T = main()::HasArgs; typename T::Arguments = main()::HasArgs::Arguments]'
13 | void Overloaded(typename T::Arguments const&)
:17:6: note: candidate: 'void Overloaded(const typename T::Arguments&) [with T = main()::HasArgs; typename T::Arguments = main()::HasArgs::Arguments]'
17 | void Overloaded(typename T::Arguments const&)
Подробнее здесь: https://stackoverflow.com/questions/791 ... pendent-ty
Почему предложения require недостаточно для устранения неоднозначности функции с зависимым типом? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение