Type типом, отличным от int?
Если просто, то потому, что ошибка следует из инстацирования шаблона класса, а не конструктора. Добавьте в глобальную область явное инстанцирование (template struct Type<bool>;, например) и этого уже хватит, чтобы получить диагностику. SFINAE работает, когда ошибка вытекает из инстанцирования шаблона функции-кандидата.
То есть, так как в момент инстанцирования конструктора компилятор уже знает значение value (а не выводит его в этот момент), то он пытается взять type из enable_if, а его там нет?
Да. ::type он всегда пытается взять, но если бы попытка происходила в процессе разрешения перегрузки - ошибка была бы мягкая (SFINAE).
А такое поведение только в SFINAE или в случае использования концепта было бы то же самое?
Только для SFINAE.
Надо срочно мигрировать на С++20...
у вас в настройках 20 стандарт. тут проще использовать concept. Если нужно через sfinae, то (кажется) можно так (согласно cppreference): https://godbolt.org/z/afxzTnWcE
Я пытаюсь проект перетащить на С++20. Сейчас он на С++17, код компилируется. Но включаю С++20 и он начинает падать на конструкции, приведенной в примере. Я не понимаю, почему на 17 он компилит, а то же самое на 20 нет. В примере на обоих стандартах не компилит...
А что компилятор об ошибках вообще ни каких не сообщает ?
а какие опции компиляции?
error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
ок, отбой, тут не в опциях дело
А вреальном примере перегрузка конструктора с вариадиком тоже присутствует?
Там происходит создание объекта. В его конструктор передается 3 параметра. Сам тип имеет 2 конструктора. Первый принимает один параметр и имеет SFINAE, показанное в примере. Второй конструктор принимает 2 параметра + пачку параметров. Эксперимент показал, что там, где С++20 дает ошибку компиляции, С++17 инстанцирует второй конструктор.
так сложнаа) если вы переезжаете на с++20, определитесь с поведением просто используйте requires (ну я бы так сделал, если это продуктовый код, а не академический интерес).
Это продуктовый код
А компилятор меняется при этом? Или в рамках одной версии компилятора?
с++17 из devtoolset-7, c++20 из devtoolset-11. Оба gcc
Так ты попробуй для начала обновить компилятор, оставив с++17, а уже после переключать сам стандарт
Хм... Сейчас попробую
Да, Вы правы. Я поменял компилятор оставив с++17 и получил ту же самую ошибку.
Обсуждают сегодня