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

Объясните, пожалуйста, почему тут не работает SFINAE в случае инстанцирования

Type типом, отличным от int?

21 ответов

38 просмотров

Если просто, то потому, что ошибка следует из инстацирования шаблона класса, а не конструктора. Добавьте в глобальную область явное инстанцирование (template struct Type<bool>;, например) и этого уже хватит, чтобы получить диагностику. SFINAE работает, когда ошибка вытекает из инстанцирования шаблона функции-кандидата.

d7d1cd- Автор вопроса
Sergey Anisimov
Если просто, то потому, что ошибка следует из инст...

То есть, так как в момент инстанцирования конструктора компилятор уже знает значение value (а не выводит его в этот момент), то он пытается взять type из enable_if, а его там нет?

d7d1cd
То есть, так как в момент инстанцирования конструк...

Да. ::type он всегда пытается взять, но если бы попытка происходила в процессе разрешения перегрузки - ошибка была бы мягкая (SFINAE).

d7d1cd- Автор вопроса
Sergey Anisimov
Да. ::type он всегда пытается взять, но если бы по...

А такое поведение только в SFINAE или в случае использования концепта было бы то же самое?

d7d1cd- Автор вопроса
Sergey Anisimov
Только для SFINAE.

Надо срочно мигрировать на С++20...

d7d1cd
То есть, так как в момент инстанцирования конструк...

у вас в настройках 20 стандарт. тут проще использовать concept. Если нужно через sfinae, то (кажется) можно так (согласно cppreference): https://godbolt.org/z/afxzTnWcE

d7d1cd- Автор вопроса
Семён
у вас в настройках 20 стандарт. тут проще использо...

Я пытаюсь проект перетащить на С++20. Сейчас он на С++17, код компилируется. Но включаю С++20 и он начинает падать на конструкции, приведенной в примере. Я не понимаю, почему на 17 он компилит, а то же самое на 20 нет. В примере на обоих стандартах не компилит...

d7d1cd
Я пытаюсь проект перетащить на С++20. Сейчас он на...

А что компилятор об ошибках вообще ни каких не сообщает ?

d7d1cd- Автор вопроса
Andrey Electron
А что компилятор об ошибках вообще ни каких не соо...

error: no type named ‘type’ in ‘struct std::enable_if<false, void>’

Семён
а какие опции компиляции?

ок, отбой, тут не в опциях дело

d7d1cd
error: no type named ‘type’ in ‘struct std::enable...

А вреальном примере перегрузка конструктора с вариадиком тоже присутствует?

d7d1cd- Автор вопроса
Семён
А вреальном примере перегрузка конструктора с вари...

Там происходит создание объекта. В его конструктор передается 3 параметра. Сам тип имеет 2 конструктора. Первый принимает один параметр и имеет SFINAE, показанное в примере. Второй конструктор принимает 2 параметра + пачку параметров. Эксперимент показал, что там, где С++20 дает ошибку компиляции, С++17 инстанцирует второй конструктор.

d7d1cd
Там происходит создание объекта. В его конструктор...

так сложнаа) если вы переезжаете на с++20, определитесь с поведением просто используйте requires (ну я бы так сделал, если это продуктовый код, а не академический интерес).

d7d1cd
Я пытаюсь проект перетащить на С++20. Сейчас он на...

А компилятор меняется при этом? Или в рамках одной версии компилятора?

d7d1cd- Автор вопроса
d7d1cd
с++17 из devtoolset-7, c++20 из devtoolset-11. Оба...

Так ты попробуй для начала обновить компилятор, оставив с++17, а уже после переключать сам стандарт

d7d1cd- Автор вопроса
Alexander Karaev
Так ты попробуй для начала обновить компилятор, ос...

Да, Вы правы. Я поменял компилятор оставив с++17 и получил ту же самую ошибку.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта