|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||
bug msvc2013 ? SFINAE std::void_t idiom not worked13.04.2021, 16:26. Показов 1903. Ответов 3
Всем привет!
Кто ни будь знает, почему в Visual Studio 2013 не работает идиома std::void_t ? Следующий код корректен с точки зрения правил языка. Но сборка msvc2013 слетает на static_assert:
0
|
||||||
| 13.04.2021, 16:26 | |
|
Ответы с готовыми решениями:
3
Streaming cluster replication bug or ne bug
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||||||||||||||||||
| 15.04.2021, 15:27 | |||||||||||||||||||||||||||||||||||||||||||
Сообщение было отмечено eva2326 как решение
Решение
что бы решить эту проблему, нужно сначала понять суть этой проблемы.
а что бы понять в чем суть проблемы, нужно сначала понять принцип действия техники void_t а для того, что бы понять принцип действия техники void_t, нужно сначала понять "принцип инстанцирования специализации шаблона по умолчанию" итак, начнем по порядку. принцип инстанцирования специализации шаблона по умолчанию: --- гласит: сначала компилятор подставляет значение по умолчанию, а затем проверяет: если полученный набор параметров удовлетворяет специализации, тогда он инстанцирует эту специализацию, в противном случае инстанцируется главный шаблон. таким образом, по умолчанию всегда запускается специализация, а не главный шаблон пример:
true,что соответствует специализации, и именно она и будет в итоге инстанцирована. void_t ---- представляет собой алиас с типом void
другими словами, std::void_t<любые параметры> - на самом деле является просто voidтеперь рассмотрим классический случай использования техники на практике:
то компилятор попытается инстанцировать дефолтную специализацию. в данном случае компилятор будет искать специализацию <T,void>а поскольку std::void_t<typename T::value_type> и есть void,то именно эту специализацию и попытается инстанцировать компилятор по умолчанию:
std::void_t<typename T::value_type> должен быть валидным.а валидным он может быть только и только в том случае, если внутри T окажется доступным тип value_typeесли же это условие не выполняется, тогда вся специализация has_value_type<T, std::void_t<typename T::value_type> > становится не_валидной,и выпадает из конкурса на инстанцирование. в этом случае, компилятор, согласно правилам SFINAE, должен выбрать оставшиёся единственным главный шаблон:
--- теперь, поняв как работает sfinae на основе void_t, уже можно анализировать проблему компиляторов msvc2013. следующий код иллюстрирует суть проблемы:
компилятор успешно инстанцировал специализацию true_type,невзирая на то, что запись class VT = typename T::value_type синтаксически не_корректна.очевидно, что это произошло потому, что компилятор и не пытался распарсить typename T::value_typeещё раз внимательно смотрим на алиас:
старым компиляторам (msvc2013 или более старым) это даёт основание забить болт на "тяжелые" вычисления, и минуя их, сразу выдать итоговый результат - voidкто-то скажет: но ведь параметры шаблона могут быть кривыми! почему это компилятор их не проверяет? на это в стандарте есть железобетонная отмазка: делай нормально, и будет у тебя нормально. а будешь делать криво - будет у тебя UB, и никто тебе ничего не должен.
потому что для тогдашнего с++11 такое поведение было корректным. в дальнейшем поведение было признано дефектом и в настоящий момент компиляторы таки обязаны валидировать параметры в SFINAE контексте. получилась забавная ситуация: для изготовления самодельного std::void_t достаточно с++11но для того, что бы оно корретно работало, требуется поддержка с++17лекарство --- самое простое и очевидное решение - использовать дискриминатор. о дискриминаторах я уже писал несколько лет назад. [Дизайн и эволюция] Дискриминация шаблона на примере макроса OUT_TO_STREAM если вкратце:
можно заставить компилятор честно проверить все параметры шаблона:
void_t,компилятор вынужден инстанцировать дискриминатор, который в свою очередь требует вычисления всех параметров шаблона, что в свою очередь не позволяет компилятору их проигнорировать. PROFIT???!!!!
3
|
|||||||||||||||||||||||||||||||||||||||||||
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
|||||||||||||
| 16.04.2021, 13:33 [ТС] | |||||||||||||
|
Лекарство сработало не только для msvc2013, а вообще - для всей линейки студий. Это сработало даже для msvc2008. Единственное: Правильно должно быть:
Для компиляторов, которые не поддерживают вариадик-шаблоны
К сожалению, радоваться пришлось не долго. Но это уже другая история.
1
|
|||||||||||||
| 16.04.2021, 13:33 | |
|
Помогаю со студенческими работами здесь
4
В чем разница между MSVC2010 и MSVC2013?
Boost.Python - линковка со статическом питоном (MSVC2013) Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|