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

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



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

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

15 ответов

30 просмотров

Жусть. Кажется, что прав всё-таки 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 и поэтому ок).

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта