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

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



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

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

15 ответов

26 просмотров

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
Карта сайта