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

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

13
Як зробити нескінченний порожній цикл, який не буде оптимізований?
Здається, що стандарт C11 означає, що операції ітерації з постійними керуючими виразами не повинні оптимізуватися. Я приймаю поради з цієї відповіді , яка конкретно цитує розділ 6.8.5 проекту проекту: Ітераційний оператор, керуючий вираз якого не є постійним виразом ..., може припускати, що реалізація припиняється. У цій відповіді зазначається, що цикл …

5
Доступ до неактивного члена профспілки та невизначена поведінка?
У мене склалося враження, що доступ до іншого unionчлена, окрім останнього набору, є UB, але я не можу знайти чітку довідку (крім відповідей, що стверджують, що це UB, але без підтримки стандарту). Отже, чи не визначена поведінка?

5
Визначення оператора "==" для Double
Чомусь я пробрався до джерела .NET Framework для класу Doubleі з'ясував, що декларація ==: public static bool operator ==(Double left, Double right) { return left == right; } Така ж логіка стосується кожного оператора. У чому сенс такого визначення? Як це працює? Чому це не створює нескінченну рекурсію?
126 c#  .net  language-lawyer 

9
Чи безпечно push_back елемент з того самого вектора?
vector<int> v; v.push_back(1); v.push_back(v[0]); Якщо другий push_back викликає перерозподіл, посилання на перше ціле число у векторі більше не буде дійсним. Так це не безпечно? vector<int> v; v.push_back(1); v.reserve(v.size() + 1); v.push_back(v[0]); Це робить його безпечним?

2
Зйомка та параметр лямбда з такою ж назвою - хто відтіняє іншого? (кланг проти gcc)
auto foo = "You're using g++!"; auto compiler_detector = [foo](auto foo) { std::puts(foo); }; compiler_detector("You're using clang++!"); clang ++ 3.6.0 та новіші роздруківки "Ви використовуєте clang ++!" і попередити про те, що захоплення foo не використовується. g ++ 4.9.0 та новіші роздруківки "Ви використовуєте g ++!" і попередити про не …

6
Лямбда повертається сама: це законно?
Розглянемо цю досить марну програму: #include <iostream> int main(int argc, char* argv[]) { int a = 5; auto it = [&](auto self) { return [&](auto b) { std::cout << (a + b) << std::endl; return self(self); }; }; it(it)(4)(6)(42)(77)(999); } В основному ми намагаємося зробити лямбда, яка повертається сама. MSVC …

3
Чи потрібно використовувати if (0), щоб пропустити регістр у комутаторі, який повинен працювати?
У мене ситуація, коли я б хотів, щоб у двох випадках у операторі перемикання C ++ обидва переходили до третього випадку. Зокрема, друга справа потрапила б до третьої справи, а перша справа також потрапила б до третьої справи, не проходячи через другу справу. У мене була німа ідея, спробував, і …

2
Коли виклик функції-члена на нульовому екземплярі призводить до невизначеної поведінки?
Розглянемо наступний код: #include <iostream> struct foo { // (a): void bar() { std::cout << "gman was here" << std::endl; } // (b): void baz() { x = 5; } int x; }; int main() { foo* f = 0; f->bar(); // (a) f->baz(); // (b) } Ми очікуємо (b)краху, …

5
Чому потрійний оператор комами оцінює лише один вираз у справжньому випадку?
Зараз я навчаюсь C ++ із книгою C ++ Primer і однією з вправ у книзі є: Поясніть, що робить наступний вираз: someValue ? ++x, ++y : --x, --y Що ми знаємо? Ми знаємо, що потрійний оператор має вищий пріоритет, ніж оператор комами. З бінарними операторами це було досить просто …

2
Програма складається по-різному у трьох основних компіляторах C ++. Який з них правильний?
Як цікаве спостереження (хоча це не має великого практичного значення) до мого попереднього запитання: Чому C ++ дозволяє нам оточувати ім'я змінної в дужках при оголошенні змінної? Я з’ясував, що поєднання декларації в круглих дужках із введеною функцією імені класу може призвести до дивовижних результатів щодо поведінки компілятора. Погляньте на …

8
Якщо ми використовуємо заголовки C у C ++, чи слід використовувати функції з std :: чи глобального простору імен?
C дещо, не зовсім, підмножина C ++. Таким чином, ми можемо використовувати більшість функцій / заголовків C у C ++, трохи змінивши ім'я ( stdio.hдо cstdio, stdlib.hдо cstdlib). Моє запитання насправді якесь смислове. У коді C ++ ( з використанням новітньої версії GCC компілятора), я можу зателефонувати printf("Hello world!");і std::printf("Hello …
113 c++  language-lawyer  std 

8
Що таке "пекло зворотного дзвінка" і як і чому RX вирішує це?
Чи може хтось дати чітке визначення разом із простим прикладом, який пояснює, що таке "пекло зворотного дзвінка" для того, хто не знає JavaScript і node.js? Коли (в яких налаштуваннях) виникає "пекла проблема зворотного дзвінка"? Чому це відбувається? Чи завжди "пекло зворотного дзвінка" пов'язане з асинхронними обчисленнями? Або "пекельний зворотний виклик" …

2
Чи зберігається у файлах вихідний код C ++ 20 мандатів?
Дещо дивне питання, однак, якщо я добре пам’ятаю, вихідний код C ++ не потребує файлової системи для зберігання своїх файлів. Зробити компілятор, який сканує рукописні документи через камеру, було б відповідною реалізацією. Хоча практично не має такого великого сенсу. Однак C ++ 20 тепер додає розташування джерела file_name. Чи означає …

9
Чи були коли-небудь тихі зміни поведінки в C ++ з новими стандартними версіями?
(Я шукаю приклад чи два, щоб довести суть справи, а не список.) Чи траплялося коли-небудь, що зміна стандарту С ++ (наприклад, з 98 на 11, 11 на 14 тощо) змінювала поведінку існуючого, чітко сформованого коду користувача з визначеною поведінкою - мовчки? тобто без попередження або помилок при компіляції з новою …

2
Ефективно фінал проти фіналу - інша поведінка
Поки що я думав, що фактично фінал та фінал більш-менш рівнозначні, і що JLS буде поводитися з ними подібними, якщо не ідентичними у фактичній поведінці. Тоді я знайшов цей надуманий сценарій: final int a = 97; System.out.println(true ? a : 'c'); // outputs a // versus int a = 97; …

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