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

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

3
Непослідовне усічення безпідписаних виразів цілих чисел бітфілдів між C ++ та C у різних компіляторах
Редагувати 2 : Я налагоджував дивну тестову помилку, коли функція, яка раніше знаходилась у вихідному файлі C ++, але перейшла у дослідний файл C, почала повертати неправильні результати. Приведений нижче MVE дозволяє відтворити проблему з GCC. Однак, коли я, за примхою, склав приклад з Кланг (а пізніше і з В. …

1
Чи гарантовано значення char, встановлене на CHAR_MAX, і воно гарантовано завершиться до CHAR_MIN?
Мій код: #include <stdio.h> #include <limits.h> int main() { char c = CHAR_MAX; c += 1; printf("CHAR_MIN=%d CHAR_MAX=%d c=%d (%c)\n", CHAR_MIN, CHAR_MAX, c, c); } Вихід: CHAR_MIN=-128 CHAR_MAX=127 c=-128 () Ми бачимо, що коли ми збільшуємо charнабір змінної CHAR_MAX, вона обертається на CHAR_MIN. Чи гарантована така поведінка? Або це буде …

1
Неочікувана InvalidOperationException при спробі змінити співвідношення через значення властивості за замовчуванням
У наведеному нижче прикладі коду я отримую таке виключення під час виконання db.Entry(a).Collection(x => x.S).IsModified = true: System.InvalidOperationException: 'Екземпляр типу сутності' B 'неможливо відстежити, оскільки інший екземпляр зі значенням ключа' {Id: 0} 'вже відстежується. Укладаючи існуючі об'єкти, переконайтеся, що додано лише один екземпляр сутності з заданим значенням ключа. Чому він …

2
Вирахування аргументу шаблону для аргументу типу функції
Розглянемо наступну програму. #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } Програма успішно збирається, і її …

1
Чому додавання другого імпульту запобігає примусовому застосуванню аргументу?
Я зіткнувся з цим питанням, намагаючись додати імпл Add<char> for Stringдо стандартної бібліотеки. Але ми можемо повторити це легко, без операторів шнаніганів. Почнемо з цього: trait MyAdd<Rhs> { fn add(self, rhs: Rhs) -> Self; } impl MyAdd<&str> for String { fn add(mut self, rhs: &str) -> Self { self.push_str(rhs); self …


1
невідповідність кланг / гкц у спеціалізації класу
Я зіткнувся з цим питанням, намагаючись спеціалізуватися tuple_size/ tuple_elementдля спеціального класу на C ++ 17 для структурованого прив’язки. Нижче код компілюється в GCC, але не в clang (обидві версії магістралі, див. Посилання нижче). #include <type_traits> template<typename T, typename... Ts> using sfinae_t = T; template<typename T, bool... Bs> using sfinae_v_t = …

2
Варіація на тему вибору типу: тривіальна побудова на місці
Я знаю, що це досить поширена тема, але наскільки типовий UB легко знайти, я ще не знайшов цього варіанту. Отже, я намагаюся формально ввести об'єкти Pixel, уникаючи фактичної копії даних. Чи дійсно це? struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v<Pixel>); Pixel* promote(std::byte* data, std::size_t …

1
Чи може вказівник на неповний тип бути неповним?
Може int (*)[]бути неповним типом? C 2018 6.2.5 1 каже: У різних точках в одиниці перекладу тип об'єкта може бути неповним (бракує достатньої інформації для визначення розміру об'єктів цього типу) або повним (має достатню інформацію). Таким чином, здається, що якщо розмір типу відомий, тип буде повним. 6.2.6.1 28 вказується, що …

1
Порядок виконання оператора new та аргумент конструктора
Чи вказує специфікація C ++ порядок operator newі конструктор Aв new C(A()). G ++ нехай порядок буде A()-> new-> C(), але clang ++ нехай буде new-> A()-> C(). Чи різниця викликана невказаною поведінкою? г ++: 7.4.0 кланг ++: 10.0.0 #include <iostream> #include <cstdlib> struct A { A() { std::cout << …

1
Спроба зрозуміти шаблони та пошук імен
Я намагаюся зрозуміти наступні фрагменти коду Фрагмент №1 template <typename T> struct A { static constexpr int VB = T::VD; }; struct B : A<B> { }; Ні gcc9, ні clang9 тут не створюють помилок. З. Чому цей код складається? Хіба ми не миттєві A<B>при спадкуванні від B? Немає VD …

1
Що означає "сильно відбувається раніше"?
Словосполучення "сильно буває раніше" вживається кілька разів у проекті стандарту C ++. Наприклад: Припинення [basic.start.term] / 5 Якщо завершення ініціалізації об'єкта зі статичною тривалістю зберігання сильно відбувається перед викликом до std :: atexit (див. [Support.start.term]), виклик до функції, переданої в std :: atexit секвенується перед викликом деструктора для об'єкта. Якщо …

2
Побудувати стандартні винятки з аргументом нульового вказівника та неможливими постумовами
Розглянемо наступну програму: #include<stdexcept> #include<iostream> int main() { try { throw std::range_error(nullptr); } catch(const std::range_error&) { std::cout << "Caught!\n"; } } GCC та Clang з libstdc ++ дзвонять std::terminateта скасовують програму із повідомленням terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct null not valid Clang з libc ++ …

1
Чи варто UB відновити функцію члена члена об'єкта, термін експлуатації якого закінчився?
Це питання випливає з цього коментаря: пояснення життя Ламбди для C ++ 20 спільних процедур щодо цього прикладу: auto foo() -> folly::coro::Task<int> { auto task = []() -> folly::coro::Task<int> { co_return 1; }(); return task; } Таким чином, питання полягає в тому, чи fooне призведе до виконання повернутої кореневищем UB. …

1
Невказане неявне створення об'єкта
Оскільки P0593 було прийнято неявне створення об'єктів для маніпулювання об'єктами низького рівня , об'єкти тепер можуть створюватися неявно в C ++ 20. Зокрема, формулювання, введене пропозицією, дозволяє певним операціям (таким як std::malloc) автоматично створювати та запускати тривалість життя об'єктів певних типів, так званих неявних типів життя , якщо введення таких …

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