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

Подробнее про language-lawyer...

Простой вопрос: допустимо ли enum { a } e = 1;? Другими словами: является ли корректным поведением присвоение значения, которого нет в наборе значений констант перечисления? Демо: $ gcc t0.c -std=c11 -pedantic -Wall -Wextra -c <nothing> $ clang t0.c -std=c11 -pedantic -Wall -Wextra -c <nothing> $ ....
4 Фев 2022 в 18:14
Заголовки stdio.h, stdlib.h, string.h объявляют size_t, NULL и т. д. Зачем объявлять size_t, NULL и т. д. вместо #include <stddef.h>?....
Скажем, у меня есть собственный класс контейнера, который хранит данные на карте: class Container { public: void add(int key, std::string value) { _data.emplace(key, std::move(value)); } private: std::map<int, std::string> _data; }; Я хочу предоставить интерфейс для доступа к значениям....
29 Янв 2022 в 22:51
В нашей лекции мы обсуждали внутреннюю возможную реализацию std::list. Лектор показал подход, при котором создается фиктивный узел для обозначения конца списка: struct Node { Node* prev; ... } Node* dummy = reinterpret_cast<Node*>(new int8_t[sizeof(Node)]); dummy->prev = ... /* last node */; Они ....
Согласно Уровню 3 модуля значений и единиц измерения CSS о значениях rem : Равен вычисленному значению размера шрифта корневого элемента. Когда указано в свойстве font-size корневого элемента, единицы rem относятся к начальному значению свойства. Однако я могу использовать запросы @media даже для ....
23 Янв 2022 в 18:02
В следующей программе в постоянном выражении создается временный объект A со всеми инициализированными полями, а затем функция f создает другой объект A по тому же адресу, пропуская ( повторная инициализация поля x, которое затем считывается: #include <memory> struct A { int x; constexpr A....
23 Янв 2022 в 10:49
В следующем коде struct A содержит два оператора неявного преобразования в char и int, а экземпляр структуры сравнивается на равенство с целочисленной константой 2: struct A { constexpr operator char() { return 1; } constexpr operator int() { return 2; } }; static_assert( A{} == 2 ); Код пр....
Я использую компилятор IAR Embedded Workbench и имею проблему с приоритетом #pragma с #if. Я использую #if 0 во время разработки для комментирования кода. #pragma в приведенном ниже коде предназначен для подавления проблем MISRA, связанных с использованием шестнадцатеричных escape-последовательносте....
20 Янв 2022 в 21:22
Ограничение на длину вопроса.. Как указал @Karl Knechtel, я сбит с толку тем, что не получаю операцию индексации массива неупорядоченных относительных к операции приращения i++? Если они не упорядочены, почему в строке C Standard 6.5.2 упоминается о (выделение добавлено к словам/фразам, которые я ....
20 Янв 2022 в 17:43
Образец кода: #define X(x,y) x y #define STR_(x) #x #define STR(x) STR_(x) STR(X(Y,Y)) Призывы: $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P "Y Y" $ gcc t222.c -std=c11 -pedantic -Wall -Wextra -E -P -D"Y()" "YY" Почему gcc удаляет пробелы между токенами предварительной обработки? Наприме....
20 Янв 2022 в 16:13
В следующем коде класс A имеет закрытую функцию-член f. Я хочу написать статическое утверждение, которое будет проверять, доступна ли эта функция из текущего контекста (как было предложено в комментарии к этот вопрос< /а>). Есть 3 подобных случая, основанных на requires-выражении: class A{ void f(....
20 Янв 2022 в 11:35
Связано: Как =delete on destructor предотвращает выделение стека? Во-первых, я понимаю, что такие вещи играют с огнем, соблазняя UB. Я прошу лучше понять крайние случаи union. Насколько я понимаю, если у меня есть класс с c'tor и d'tor и я поместил его в union, компилятор заставит меня сказать ему,....
19 Янв 2022 в 19:42
struct X { int n; }; const X *p = new const X{3}; // #1 new (const_cast<X*>(p)) const X{5}; // #2 const int c = std::launder(p)->n; Предположим, что объект, созданный в #1, называется obj1, а объект, созданный в #2, называется obj2. Предварительное условие std::launder состоит в том, что [ptr.l....
17 Янв 2022 в 18:26
В следующем коде struct A имеет непосредственный конструктор функции по умолчанию, а объект структуры создается в динамической памяти средствами new A{}: struct A { consteval A() {} }; int main() { new A{}; } Только Clang принимает это. GCC жалуется error: the value of '<anonymous>'....
17 Янв 2022 в 18:24
Я тестирую разные режимы инициализации членов класса с помощью следующего небольшого кода: struct S { S() { std::cout << "ctor\n"; } S(const S&) { std::cout << "cc\n"; } S(S&&) noexcept{ std::cout << "mc\n"; } S& operator=(const S&) { std::cout << "ca\n"; return *this; } S& opera....
17 Янв 2022 в 13:53
В следующей программе шаблон структуры A<int> имеет специализацию A<char>: template <int> struct A { constexpr operator int() { return 1; } }; template <char c> struct A<c> { constexpr operator int() { return 2; } }; int main() { static_assert( A<1000>{} == 1 ); //ok in Clang and GCC stati....
Почему printf("%ld\n", (void *)0 - (void *)0); Компилировать, но printf("%ld\n", (void *)0 + (void *)0); Не?....
В C11 (и более поздних версиях) целочисленное константное выражение должно иметь только операнды, которые, в частности: плавающие константы, которые являются непосредственными операндами приведения Следующий код: int a[ A > B ? 16 : 32 ]; Когда A и B являются плавающими константами, недопустимо в C....
Существует ли максимальная длина строковых литералов в Scheme? Или это зависит от реализации схемы? В C стандарты определяют максимальную длину строковых литералов для переносимых программ. Есть ли аналогичная спецификация для Scheme?....
14 Янв 2022 в 09:00
Скажем, я работаю над библиотекой под названием libModern. Эта библиотека использует устаревшую библиотеку C, называемую libLegacy, в качестве стратегии реализации. Интерфейс libLegacy выглядит так: typedef uint32_t LegacyFlags; struct LegacyFoo { uint32_t x; uint32_t y; LegacyFlags f....
14 Янв 2022 в 01:55
лямбды считаются выражениями. Согласно cppreference, выражение – это "последовательность операторов и их операндов, задает вычисление». Выражение также имеет категорию значения и тип: «Лямбда-выражение представляет собой выражение prvalue уникального безымянного несоюзного неагрегированного типа ....
13 Янв 2022 в 19:47
В C89 A.1.2.2 Объявления прямой декларатор [ константное выражение ] В C99 A.2.2 Объявления прямой-декларатор [тип-квалификатор-список_opt присвоение-выражение_opt] Я понимаю assignment-expression_opt как var = 1;. Но массивы не объявляются как int arr[i = 0];. Почему C99 использует термин «выраже....
13 Янв 2022 в 17:18
Является ли этот идентификатор непроблемным: _var C11, 7.1.3 Зарезервированные идентификаторы, 1 Все идентификаторы, которые начинаются с подчеркивания, всегда зарезервированы для использования в качестве идентификаторов с областью действия файла как в обычном пространстве, так и в пространстве име....
12 Янв 2022 в 20:02
Я могу понять, что: Одним из источников UB является повышение производительности (например, путем удаления никогда не выполнявшегося кода, такого как if (i+1 < i) { /* never_executed_code */ }; UPD: если i является целым числом со знаком). UB может запускаться во время компиляции, потому что C не де....
struct A { int i; consteval A() { i = 2; }; consteval void f() { i = 3; } }; constexpr bool g() { A a; a.f(); return true; } int main() { static_assert(g()); } https://godbolt.org/z/hafcab7Ga Программа отклонена всеми GCC, Clang, MSVC и ICC, и замена constexpr н....
12 Янв 2022 в 14:51