В следующем примере (попробуйте онлайн) добавление тривиального ограничения требует 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++
Программы на C++. Форум разработчиков
1730923504
Anonymous
В следующем примере (попробуйте онлайн) добавление тривиального ограничения требует 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&)
Подробнее здесь: [url]https://stackoverflow.com/questions/79164091/why-is-a-requires-clause-not-enough-to-disambiguate-a-function-with-dependent-ty[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия