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

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

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

21 ответов

14 просмотров

Если просто, то потому, что ошибка следует из инстацирования шаблона класса, а не конструктора. Добавьте в глобальную область явное инстанцирование (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- Автор вопроса
d7d1cd
Я пытаюсь проект перетащить на С++20. Сейчас он на...

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

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

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

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

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

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

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

читать файл максимально быстро? странный вопрос))
zamtmn
53
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
16
или вы считаете муит дает знание?
супер_лох_3000 альфа версия
12
А кто такой мужчина в твоем понимании Азиз?
who?です 🐈
11
Ну значит тебе повезло, мы же про транк говорим оба?
Александр (Rouse_) Багель
11
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем ку. Подскажите, если задекларировал массив так: int arr[10] = {1, 2, 3, 4}, то в arr[4] будет мусор или нуль?
Sasha K
14
буквально один оставшийся вопрос при выполнении строчки mov eax, 5 операнд "5" будет присутствовать где-либо в памяти (любой), кроме как в памяти блока .code? подвопрос: как...
12
Карта сайта