Вопросы с тегом «language-lawyer»

Для вопросов о тонкостях формальных или авторитетных спецификаций языков программирования и сред.

2
Почему классы асинхронных конечных автоматов (а не структуры) в Roslyn?
Давайте рассмотрим этот очень простой асинхронный метод: static async Task myMethodAsync() { await Task.Delay(500); } Когда я компилирую это с помощью VS2013 (до компилятора Roslyn), сгенерированный конечный автомат представляет собой структуру. private struct <myMethodAsync>d__0 : IAsyncStateMachine { ... void IAsyncStateMachine.MoveNext() { ... } } Когда я компилирую его с VS2015 …

2
std :: ignore со структурированными привязками?
Прелюдия: std::tuple<int, int, int> f(); std::tuple<int, int, float, int> g(); C ++ 1z представит синтаксис для структурированных привязок, который позволит писать вместо int a, b, c; std::tie(a, b, c) = f(); что-то вроде auto [a, b, c] = f(); Однако std::tieтакже можно указать std::ignoreигнорировать определенные компоненты, например: std::tie(a, b, std::ignore, …

6
Почему ссылки не являются «константными» в C ++?
Мы знаем, что «константная переменная» указывает, что после назначения вы не можете изменить переменную, например: int const i = 1; i = 2; Приведенная выше программа не скомпилируется; gcc выводит сообщение об ошибке: assignment of read-only variable 'i' Нет проблем, я могу это понять, но следующий пример выходит за рамки …



3
Законно ли исходный код, содержащий неопределенное поведение, вызывать сбой компилятора?
Скажем, я собираюсь скомпилировать какой-то плохо написанный исходный код C ++, который вызывает неопределенное поведение, и поэтому (как говорится) «все может случиться». С точки зрения того, что спецификация языка C ++ считает приемлемым для "совместимого" компилятора, "что-нибудь" в этом сценарии включает сбой компилятора (или кражу моих паролей, или иное некорректное …

2
Безопасно ли удалить nullptr в с ++ 0x?
В c++03ней довольно ясно , что удаление пустого указателя не имеет никакого эффекта. В самом деле, это прямо указано в §5.3.5/2том, что: В любом случае, если значением операнда удаления является нулевой указатель, операция не имеет никакого эффекта. Тем не менее, в текущем проекте для c++0xэтого предложения , кажется, отсутствует. В …

6
Чистые функции: означает ли «отсутствие побочных эффектов» «всегда одинаковый результат при одинаковом вводе»?
Два условия, которые определяют функцию pure, следующие: Без побочных эффектов (т.е. разрешены только изменения в локальной области) Всегда возвращать один и тот же вывод, учитывая тот же ввод Если первое условие всегда верно, бывает ли когда-нибудь второе условие неверно? Т.е. действительно ли это необходимо только с первым условием?

3
Всегда ли указатель с правильным адресом и типом является действительным указателем, начиная с C ++ 17?
(В отношении этого вопроса и ответа .) До стандарта C ++ 17 в [basic.compound] / 3 было включено следующее предложение : Если объект типа T расположен по адресу A, говорят, что указатель типа cv T *, значением которого является адрес A, указывает на этот объект, независимо от того, как было …

4
Другое поведение оператора запятой в с ++ с возвратом?
Это (обратите внимание на оператор запятой ): #include <iostream> int main() { int x; x = 2, 3; std::cout << x << "\n"; return 0; } выходы 2 . Однако, если вы используете returnоператор запятой, это: #include <iostream> int f() { return 2, 3; } int main() { int x; …

4
Безопасно ли выполнять memcpy (0,0,0)?
Я не так хорошо разбираюсь в стандарте C, поэтому, пожалуйста, потерпите меня. Я хотел бы знать, гарантируется ли это по стандарту, что memcpy(0,0,0)это безопасно. Единственное ограничение, которое я смог найти, это то, что если области памяти перекрываются, то поведение не определено ... Но можно ли считать, что области памяти здесь …

6
Разрешено ли компилятору оптимизировать локальную изменчивую переменную?
Разрешено ли компилятору оптимизировать это (согласно стандарту C ++ 17): int fn() { volatile int x = 0; return x; } к этому? int fn() { return 0; } Если да, то почему? Если нет, то почему? Вот некоторые размышления по этому поводу: текущие компиляторы компилируются fn()как локальная переменная, помещенная …

7
Могу ли я использовать NULL в качестве замены для значения 0?
Могу ли я использовать NULLуказатель в качестве замены для значения 0? Или что-то не так в этом? Как, например: int i = NULL; как замена для: int i = 0; В качестве эксперимента я скомпилировал следующий код: #include <stdio.h> int main(void) { int i = NULL; printf("%d",i); return 0; } …

5
Порядок оценки индексов массива (по сравнению с выражением) в C
Глядя на этот код: static int global_var = 0; int update_three(int val) { global_var = val; return 3; } int main() { int arr[5]; arr[global_var] = update_three(2); } Какая запись массива обновляется? 0 или 2? Есть ли часть в спецификации C, которая указывает приоритет работы в этом конкретном случае?

3
std :: vector (ab) использует автоматическое хранение
Рассмотрим следующий фрагмент: #include <array> int main() { using huge_type = std::array<char, 20*1024*1024>; huge_type t; } Очевидно, что это приведет к сбою на большинстве платформ, поскольку размер стека по умолчанию обычно составляет менее 20 МБ. Теперь рассмотрим следующий код: #include <array> #include <vector> int main() { using huge_type = std::array<char, …

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.