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

90
Ошибка при использовании внутриклассовой инициализации нестатического члена данных и конструктора вложенного класса

Следующий код довольно тривиален, и я ожидал, что он будет нормально компилироваться. struct A { struct B { int i = 0; }; B b; A(const B& _b = B()) : b(_b) {} }; Я тестировал этот код с g ++ версии 4.7.2, 4.8.1, clang ++ 3.2 и 3.3. Помимо того факта, что в этом коде происходит ошибка g ++...

89
Является ли это известной ловушкой C ++ 11 для циклов?

Представим, что у нас есть структура для хранения 3 двойников с некоторыми функциями-членами: struct Vector { double x, y, z; // ... Vector &negate() { x = -x; y = -y; z = -z; return *this; } Vector &normalize() { double s = 1./sqrt(x*x+y*y+z*z); x *= s; y *= s; z *= s; return *this; } //...

88
Когда мне следует использовать @classmethod, а когда def (self)?

При интеграции приложения Django, которое я раньше не использовал, я обнаружил два разных способа определения функций в классах. Автор, кажется, намеренно использует их оба. Первым я сам часто пользуюсь: class Dummy(object): def some_function(self,*args,**kwargs): do something here self is the...

88
Можно ли считать ветки с неопределенным поведением недоступными и оптимизировать их как мертвый код?

Рассмотрим следующее утверждение: *((char*)NULL) = 0; //undefined behavior Он явно вызывает неопределенное поведение. Означает ли существование такого оператора в данной программе, что вся программа не определена или что поведение становится неопределенным только после того, как поток управления...

87
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также можно указать...

87
Почему классы асинхронных конечных автоматов (а не структуры) в Roslyn?

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

86
Почему ссылки не являются «константными» в C ++?

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

85
Безопасно ли удалить nullptr в с ++ 0x?

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

85
Законно ли исходный код, содержащий неопределенное поведение, вызывать сбой компилятора?

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

84
Всегда ли указатель с правильным адресом и типом является действительным указателем, начиная с C ++ 17?

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

84
Чистые функции: означает ли «отсутствие побочных эффектов» «всегда одинаковый результат при одинаковом вводе»?

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

83
Другое поведение оператора запятой в с ++ с возвратом?

Это (обратите внимание на оператор запятой ): #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; x = f();...

80
Безопасно ли выполнять memcpy (0,0,0)?

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

79
Разрешено ли компилятору оптимизировать локальную изменчивую переменную?

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

73
Могу ли я использовать NULL в качестве замены для значения 0?

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

47
Порядок оценки индексов массива (по сравнению с выражением) в 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, которая указывает приоритет работы в этом конкретном...

46
std :: vector (ab) использует автоматическое хранение

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