170 похожих чатов

Головоломка для ценителей. По мотивам вопроса от одного моего студента.



Кланг компилирует, gcc нет: https://godbolt.org/z/Y17o4oGbr

Кто прав, как обосновать? =)

15 ответов

10 просмотров

Жусть. Кажется, что прав всё-таки gcc. Сомнительно, что этот decltype на что-то влияет

Зачем-то много всего накручено, это то же, что и: template <typename T, typename... Ts> void foo() { } template <typename T> void foo() { } int main() { foo<int>(); } Имхо прав GCC.

А там случаем не надо бы this везде добавить?

Konstantin-Vladimirov Автор вопроса
Alexander Tulikov
Зачем-то много всего накручено, это то же, что и: ...

Как тут уже догадались, если поставить this (или убрать class) то оба справляются. Неужели оба в этом случае не правы?

Konstantin-Vladimirov Автор вопроса
Egor Suvorov
Жусть. Кажется, что прав всё-таки gcc. Сомнительно...

А если убрать struct и убрать decltype, то оба не справляются, этот decltype очень нужен, он SFINAE-case делает =)

Konstantin Vladimirov
Как тут уже догадались, если поставить this (или у...

Ну тогда понятно, что для пустого параметр пака не сможет вывестись тип шаблона в decltype. Занятный пример. Без класса тогда можно так записать: template <typename T> void foo() { } template <typename T, typename... Ts> auto foo() -> decltype(foo<Ts...>()) { } int main() { foo<int>(); }

Я не мог не проверить. https://asciinema.org/a/HyhEhtqOPz6FGJeZxwW6lfcXI

Konstantin-Vladimirov Автор вопроса
🐈
Я не мог не проверить. https://asciinema.org/a/Hy...

g++ же надо... Ну и потом зачем такие ужасы когда есть годболт?

Konstantin Vladimirov
g++ же надо... Ну и потом зачем такие ужасы когда ...

Мне gcc в termux не воткнуть. годболт неудобен с телефона

Прав Clang. Пример сводится к https://godbolt.org/z/qxbxvfKEs struct S { template <typename> void /* #1 */ as(); template <typename, typename... Ts> auto /* #2 */ as() -> decltype(as<Ts...>()); }; void test() { S{}.as<short, int, long>(); } который GCC почему-то компилирует, считая после подстановки trailing-return-type #2, что мн-во overloading candidates для as это все ф-и класса, включая саму перегрузку #2. На самом деле мн-во кандидатов должно включать в себя только то что объявлено до #2, т.е только #1 в нашем случае.

Konstantin-Vladimirov Автор вопроса
Andrey Davydov
Прав Clang. Пример сводится к https://godbolt.org/...

Очень красивая редукция, мои поздравления )) Действительно, дело в том: 1. Где кончается полное объявление 2. Нужно ли оно для набора в множество кандидатов

Andrey Davydov
Прав Clang. Пример сводится к https://godbolt.org/...

Но почему оно не должно включать само себя? Разве рекурсивный вызов самого себя не надо рассматривать?

Pavel Zhigulin
Но почему оно не должно включать само себя? Разве ...

Хотя да, как тогда вообще закончить подобную рекурсию, логично

Pavel Zhigulin
Но почему оно не должно включать само себя? Разве ...

Чтобы писать auto f() -> decltype(f()); было неповадно

Andrey Davydov
Чтобы писать auto f() -> decltype(f()); было непов...

Но что если у нас f() есть в глобальном пространстве имён?) Соответственно у нас должен инстанцироваться вариант от глобального f() (он ведь валиден?), но вариант с подстановкой себя - ошибка (но SFINAE и поэтому ок).

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
11
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Коллеги, а в чём сейчас хорошо писать на перле, в смысле ide? Пробовал в идее с плагином, подсветка есть, даже какие-то предупреждения есть, но рефакторинга считай нет. Перене...
Дмитрий Петров
9
Can I forward ports (including the SSH port) between two machines without SSH? I know I can forward SSH server port from machine A (which blocks all requests by firewall) to ...
required optional
5
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
Карта сайта