Вопрос для стандартных юристов C ++. Я чувствую, что следующий код должен быть принят на 100% и способен создавать экземпляр, когда определяется параметр шаблона, для которого определяется контейнер -размер (t const &) , но GCC (все версии, поддерживающие C ++ 23, включая туловище) отклоняет конструкции с использованием сцепного возврата с зависимыми именами:
#include
// wraps lvalues by ref and xvalues by move
template
struct wrap {
T obj;
friend consteval auto size(wrap const &) {
return size_;
}
};
// error in gcc, ok in clang:
template
wrap(T && a) -> wrap;
// error in gcc, ok in clang:
template
auto make_wrap(T && a) -> wrap {
return {std::forward(a)};
}
// ok in gcc and clang but requires T to be
// default-constructible:
template
auto make_wrap1(T && a) -> wrap {
return {std::forward(a)};
}
// ok in gcc and clang:
template
auto make_wrap2(T && a) {
return wrap{std::forward(a)};
}
Попробуйте здесь: https://godbolt.org/z/bo1bjzyqz. Ошибка: < /p>
Не существует аргументов для «размера», которые зависят от параметра шаблона,
, поэтому объявление «размер» должно быть доступно [-fpermissive] < /p>
< /blockquote>
. size (t {}) вместо size (a) . Но явно зависит от параметра шаблона t , так что оба должны работать, а Кланг все принимает.
это тогда ошибка в GCC?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... g-in-gcc-o
Зависимые имена в руководствах вычета C ++ и типах возврата в следование - ошибка в GCC или плохо сформированные? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение