|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||||||||||||||||||||||||||||||||||||||||||||
баг msvc, или компиляторы право имеют? (отбрасывание const для возвращаемого типа приводит к ошибке ODR)25.02.2020, 18:03. Показов 1742. Ответов 12
Всем привет!
Рассмотрим пример:
Корректен ли данный код? Должны ли компиляторы различать const t и t для не-классовых возвращаемых типов?Должны ли компиляторы различать const void и void?Вот всё, что я нашла по этому поводу в стандарте языка:
В интернетах пишут, что компилятор действительно может отбросить квалификатор у возвращаемого значения не-классового-типа. И что можно запросто столкнуться с ситуацией, когда линкеру действительно окажется все равно: const t или t.Что думают об этом сами компиляторы/линкеры? Если вместо void использовать double, тогда линкер msvc2019 выдал ошибку:
То бишь, msvc2019 не различает конкретно void foo() и const void foo()К сожалению нет под рукой gcc/clang, что бы сделать многофайловый проект. Но на онлайн компиляторе они у меня отработали корректно. Объявления типов агрят gcc и clang:
Никаких предупреждений. Забавно, gcc и clang предупреждают, но отрабатывают корректно. msvc ни о чем не предупреждает, но отрабатывает неправильно. В следующем коде: https://rextester.com/ODDZ46574
Зависит от того, какой шаблон инстанцирован первым. Если первым инстанцировать шаблон для f2 (как в примере выше), тогда результат всегда будет 1. Если же поменять местами:
Если при этом в проект добавить ещё один cpp (можно даже пустой), тогда линкер msvc2019 сделает ошибку:
Очень похоже на баг в компиляторах Visual Studio, связанный с тем, что они не видят разницы между void foo() и const void foo()Воспроизводится только с типом voidДля других типов, например для int(), const int() работают корректно. Теперь два вопроса этой темы: 1. Проблема из-за const void() - это баг компиляторов, или UB в юзерском коде?2. Можно ли как то починить сборку для msvc? Мне нужно, что бы сборки всех компиляторов работали одинаково. Добавлено через 25 минут 111
0
|
||||||||||||||||||||||||||||||||||||||||||||||||
| 25.02.2020, 18:03 | |
|
Ответы с готовыми решениями:
12
Почему отсутствие возвращаемого значения не приводит к ошибке компиляции? AddNew приводит к ошибке Ошибка 800a0bb9 Аргументы имеют неверный тип, выходят за пределы допустимого диапазона .. Использование int или void в качестве возвращаемого типа для main() |
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||
| 25.02.2020, 18:18 | ||||
void и void const являются отдельными типами, так же как и все типы с определенными константами отличаются от их не константных аналогов.
1
|
||||
|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||||||||||||||||||
| 25.02.2020, 18:57 [ТС] | ||||||||||||||||||||||
|
Например:
decltype(foo()); - сложное выражение. Оно состоит из выражения foo(), возвращающего prvalue const int, которое сначала должно деградировать до int, и только после этого продолжится вычисление итогового выражения decltype(int);.В моём же случае баг заключается в том, что деградировало не выражение prvalue, которое возвращает функуция foo(), а вообще - сам тип.https://rextester.com/ECTOGC76783
0
|
||||||||||||||||||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||||||||||||
| 25.02.2020, 19:37 | |||||||||||||
|
Добавлено через 2 минуты
1
|
|||||||||||||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|||
| 26.02.2020, 01:40 | |||
void foo(); и const void foo() {...} обозначают одну и ту же функцию (предполагается, что оба этих объявления в global scope), т.к. возвращаемый тип не участвует в определении того, обозначают ли два объявления одну и ту же функцию.[basic.link]/11 требует, чтобы типы объявлений, обозначающих одну и ту же функцию, после всех type adjustments, были идентичными, что в данном коде не выполняется, т.к. отбрасывание top-level const у типа возвращаемого значения не входит в type adjustments (отбрасывание top-level const у параметров функции входит). Таким образом, код нарушает [basic.link]/11. decltype(foo()) это не выражение.
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||
| 26.02.2020, 13:03 | ||||||||||||||||||
|
проблема с манглингом имен. манглинг должен учитывать всю совокупность данных о функции: квалифицированное имя, список параметров, и тип возвращаемого значения посмотри какие заманглиновые имена получаются у компиляторов Visual Studio:
а вот в случае с void - лажанул. а ты можешь использовать обходной путь:
значит можно просто запретить редкий кейс для мелкомягких. ну и отписать им баг. пускай чинят.
1
|
||||||||||||||||||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 26.02.2020, 17:57 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 27.02.2020, 01:56 | ||||||||||||
|
функции из разных ед. трансляции могут различаться только типом возращаемого значения:
тип возвращаемого значения входит в сигнатуру шаблоно-функций:
0
|
||||||||||||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|||
| 27.02.2020, 02:42 | |||
|
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 28.02.2020, 17:38 | |||
|
Добавлено через 2 минуты
0
|
|||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
| 28.02.2020, 18:27 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||||
| 28.02.2020, 19:17 | ||||||||||||||||||||||||
|
и ладно бы оно ещё хотя бы практикой подтверждалось, так нет же. вот это: поскольку отсутствует сама ссылка. (твой любимый Кэп) язык не запрещает создавать какие угодно и до тех пор, пока они не конфликтуют - проблем никаких.
0
|
||||||||||||||||||||||||
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|||||
| 28.02.2020, 19:41 | |||||
|
1
|
|||||
| 28.02.2020, 19:41 | |
|
Помогаю со студенческими работами здесь
13
Ключевое слово const для возвращаемого значения из функции Ошибка "значение типа "const char [81]" нельзя использовать для инициализации сущности типа "const unsigned char [61]" Запрос для вывода данных "продажа товара по типу" приводит к ошибке Present у LPDIRECT3DSWAPCHAIN9 приводит к ошибке
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|