Запитання з тегом «language-lawyer»

Питання щодо тонкощів формальних чи авторитетних специфікацій мов програмування та середовищ.

6
Який правильний спосіб перетворити 2 байти в підписане 16-бітове ціле число?
У цій відповіді , zwol зробив цю заяву: Правильний спосіб перетворення двох байтів даних із зовнішнього джерела в 16-бітове ціле число - це допоміжні функції: #include <stdint.h> int16_t be16_to_cpu_signed(const uint8_t data[static 2]) { uint32_t val = (((uint32_t)data[0]) << 8) | (((uint32_t)data[1]) << 0); return ((int32_t) val) - 0x10000u; } int16_t …

2
Чому граматика BNF C допускає декларації з порожньою послідовністю init-деклараторів?
Переглядаючи граматику BNF C, я подумав, що дивно, що виробниче правило для декларації виглядає таким чином (згідно https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; Навіщо використовувати *кількісний коефіцієнт (що означає нуль або більше подій) для init-declarator? Це дозволяє твердженням, таким як int;або void;бути синтаксично дійсними, навіть …

2
Чому std :: hash не гарантовано буде детермінованим?
Згодом ми використовуємо N4140 (стандарт C ++ 14). Відповідно до § 17.6.3.4 Вимоги до хешу , Повернене значення залежить лише від аргументу k протягом тривалості програми . [Примітка. Таким чином, всі оцінки виразу h(k)з однаковим значенням kдають однаковий результат для заданого виконання програми . - кінцева примітка] і § 20.9.12 …

1
Клас не може отримати доступ до свого приватного статичного методу constexpr - помилка Clang?
Цей код не компілюється в Clang (6,7,8,9, магістраль), але просто добре поєднується в GCC (7.1, 8.1, 9.1): template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) { return TypeHolder<bool>{}; } else …

2
Несподівана оптимізація strlen при зведенні 2-d масиву
Ось мій код: #include <string.h> #include <stdio.h> typedef char BUF[8]; typedef struct { BUF b[23]; } S; S s; int main() { int n; memcpy(&s, "1234567812345678", 17); n = strlen((char *)&s.b) / sizeof(BUF); printf("%d\n", n); n = strlen((char *)&s) / sizeof(BUF); printf("%d\n", n); } Використання gcc 8.3.0 або 8.2.1 з …

3
Чому обрано таке перевантаження оператора перетворення?
Розглянемо наступний код . struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } Тут другий оператор перетворення вибирається за роздільною здатністю перевантаження. Чому? Наскільки я розумію, два оператори виводяться на operator int &&() …

3
Чи нормально повернути значення аргументу за замовчуванням за допомогою посилання const?
Чи нормально повернути значення аргументу за замовчуванням за посиланням const, як у наведених нижче прикладах: https://coliru.stacked-crooked.com/a/ff76e060a007723b #include <string> const std::string& foo(const std::string& s = std::string("")) { return s; } int main() { const std::string& s1 = foo(); std::string s2 = foo(); const std::string& s3 = foo("s"); std::string s4 = foo("s"); …

1
Яка семантика об'єктів, що перекриваються в С?
Розглянемо таку структуру: struct s { int a, b; }; Зазвичай 1 , ця структура матиме розмір 8 та вирівнювання 4. Що робити, якщо ми створимо два struct sоб'єкти (точніше, запишемо у виділене сховище два такі об’єкти), причому другий об’єкт перекриє перший? char *storage = malloc(3 * sizeof(struct s)); struct …

3
Чи дозволено компілятору постійно складати локальну мінливу?
Розглянемо цей простий код: void g(); void foo() { volatile bool x = false; if (x) g(); } https://godbolt.org/z/I2kBY7 Ви бачите, що gccні clangоптимізуйте потенційний дзвінок g. Це правильно в моєму розумінні: абстрактна машина передбачає, що volatileзмінні можуть змінюватися в будь-який момент (через те, що, наприклад, апаратне відображення), тому постійне …


3
C ++ 20 понять: яку спеціалізацію шаблону обирають, коли аргумент шаблону кваліфікується для кількох понять?
Подано: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

3
Різниця в поведінці змінної функції лямбда від посилання на глобальну змінну
Я виявив, що результати компіляторів відрізняються, якщо я використовую лямбда, щоб захопити посилання на глобальну змінну із змінним ключовим словом, а потім змінити значення у функції лямбда. #include <stdio.h> #include <functional> int n = 100; std::function<int()> f() { int &m = n; return [m] () mutable -> int { m …

1
Використання змінної у власному ініціалізаторі
[basic.scope.pdecl] / 1 стандартного проекту C ++ 20 мав наступний (ненормативний) приклад у примітці (часткова цитата до об'єднання запиту 3580 , див. відповідь на це запитання): unsigned char x = x; [...] x ініціалізується із власним (невизначеним) значенням. Чи насправді це чітко визначена поведінка в С ++ 20? Зазвичай самоініціалізація …

3
Чи зберігається делетер shared_ptr в пам'яті, виділений спеціальним розподільником?
Скажіть, у мене є shared_ptrспеціальний розподільник і користувацький делетер. Я не можу знайти нічого, що відповідає стандарту, який би говорив про те, де слід зберігати делетер: він не говорить про те, що користувацький розподільник буде використовуватися для пам'яті делетера, і не говорить про те, що його не буде. Це не …

2
Чи є тип POD точно таким же, як тривіальний, стандартний тип макета?
У C ++ 20 поняття POD є застарілим, нібито тому, що це безглузда складна риса тривіальності та стандартного макета. Однак визначення POD у проекті С ++ 20 не є точно "і тривіальним, і стандартним макетом"; це насправді: Клас POD - це клас, який є і тривіальним класом, і класом стандартного …

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.