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

125
Лямбда-захват и параметр с тем же именем - кто затеняет другого? (clang против 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...

120
Когда вызов функции-члена в экземпляре NULL приводит к неопределенному поведению?

Рассмотрим следующий код: #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)сбоя, потому что xдля нулевого...

119
Почему тернарный оператор с запятыми оценивает только одно выражение в истинном случае?

В настоящее время я изучаю C ++ с помощью книги C ++ Primer, и одно из упражнений в книге: Объясните, что делает следующее выражение: someValue ? ++x, ++y : --x, --y Что мы знаем? Мы знаем, что тернарный оператор имеет более высокий приоритет, чем оператор запятой. С бинарными операторами это было...

116
Программа компилируется по-разному в трех основных компиляторах C ++. Какой из них правильный?

В качестве интересного продолжения (хотя и не имеющего большого практического значения) моего предыдущего вопроса: почему C ++ позволяет нам заключать имя переменной в круглые скобки при объявлении переменной? Я обнаружил, что объединение объявления в круглых скобках с введенной функцией имени...

113
Что такое «ад обратных вызовов» и как и почему RX решает эту проблему?

Может ли кто-нибудь дать четкое определение вместе с простым примером, объясняющим, что такое «ад обратных вызовов» для тех, кто не знает JavaScript и node.js? Когда (в каких настройках) возникает "проблема с обратным вызовом"? Почему это происходит? Всегда ли «ад обратных вызовов» связан с...

113
При использовании заголовков C в C ++ должны ли мы использовать функции из std :: или глобального пространства имен?

C в некоторой степени, не совсем так, является подмножеством C ++. Таким образом, мы можем использовать большинство функций / заголовков C в C ++, немного изменив имя ( stdio.hна cstdio, stdlib.hна cstdlib). На самом деле мой вопрос носит семантический характер. В коде C ++ ( с использованием...

106
Обязан ли C ++ 20 хранить исходный код в файлах?

Однако немного странный вопрос, если я правильно помню, исходный код C ++ не требует файловой системы для хранения файлов. Наличие компилятора, который сканирует рукописные документы через камеру, было бы соответствующей реализацией. Хотя практически не имеет особого смысла. Однако C ++ 20 теперь...

104
Эффективно final vs final - другое поведение

До сих пор я думал, что фактически final и final более или менее эквивалентны и что JLS будет рассматривать их одинаково, если не идентично в реальном поведении. Затем я нашел этот надуманный сценарий: final int a = 97; System.out.println(true ? a : 'c'); // outputs a // versus int a = 97;...

104
Были ли когда-нибудь изменения в тихом поведении C ++ с новыми стандартными версиями?

(Я ищу пару примеров, чтобы доказать свою точку зрения, а не список.) Было ли когда-нибудь изменение стандарта C ++ (например, с 98 на 11, с 11 на 14 и т. Д.) Изменяло поведение существующего, правильно сформированного пользовательского кода с определенным поведением - незаметно? т.е. без...

104
Возможна ли нулевая ссылка?

Действителен ли этот фрагмент кода (и определено ли поведение)? int &nullReference = *(int*)0; Оба г ++ и лязг ++ компиляция без какого - либо предупреждения, даже при использовании -Wall, -Wextra, -std=c++98, -pedantic, -Weffc++... Конечно, ссылка на самом деле не является нулевой, поскольку...

102
Путаница с инициализацией массива в C

На языке C, если инициализировать массив следующим образом: int a[5] = {1,2}; тогда все элементы массива, которые не инициализированы явно, будут неявно инициализированы нулями. Но, если я инициализирую массив следующим образом: int a[5]={a[2]=1}; printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3],...

100
«Else if» - одно ключевое слово?

Я новичок в C ++. Я часто вижу условное выражение, подобное приведенному ниже: if statement_0; else if statement_1; Вопрос: Синтаксически я должен рассматривать else ifкак одно ключевое слово? Или это действительно вложенный ifоператор внутри внешнего, elseкак показано ниже? if statement_0; else...

97
Как может работать программа с глобальной переменной main вместо основной функции?

Рассмотрим следующую программу: #include <iostream> int main = ( std::cout << "C++ is excellent!\n", 195 ); Используя g ++ 4.8.1 (mingw64) в ОС Windows 7, программа компилируется и работает нормально, печатая: C ++ отличный! к консоли. mainвыглядит как глобальная переменная, а не...

94
Имеет ли этот код из раздела 36.3.6 4-го издания «Язык программирования C ++» четко определенное поведение?

В разделе « Операции, подобные STL» Бьярна Страуструпа The C ++ Programming Language 4th edition, в качестве примера цепочки используется следующий код :36.3.6 void f2() { std::string s = "but I have heard it works even if you don't believe in it" ; s.replace(0, 4, "" ).replace( s.find( "even" ),...

94
Эффективное преобразование без знака в знак, позволяющее избежать поведения, определяемого реализацией

Я хочу определить функцию, которая принимает unsigned intаргумент as и возвращает аргументу, intсовпадающему по модулю UINT_MAX + 1. Первая попытка может выглядеть так: int unsigned_to_signed(unsigned n) { return static_cast<int>(n); } Но, как известно любому юристу по языку, приведение...

93
Печать нулевых указателей с% p является неопределенным поведением?

Является ли неопределенное поведение печатью нулевых указателей с помощью %pспецификатора преобразования? #include <stdio.h> int main(void) { void *p = NULL; printf("%p", p); return 0; } Вопрос относится к стандарту C, а не к реализациям C....

92
Когда частный конструктор не является частным конструктором?

Допустим, у меня есть тип, и я хочу сделать его конструктор по умолчанию закрытым. Я пишу следующее: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot...

92
Почему (только) некоторые компиляторы используют один и тот же адрес для одинаковых строковых литералов?

https://godbolt.org/z/cyBiWY Я вижу два 'some'литерала в коде ассемблера, сгенерированном MSVC, но только один с clang и gcc. Это приводит к совершенно другим результатам выполнения кода. static const char *A = "some"; static const char *B = "some"; void f() { if (A == B) { throw "Hello, string...

92
Когда в C ++ информация о типах передается в обратном направлении?

Я только что наблюдал, как Стефан Т. Лававедж выступал CppCon 2018на « Выведении аргументов из шаблона класса», где в какой-то момент он, между прочим, сказал: В типе C ++ информация почти никогда не течет в обратном направлении ... Мне пришлось сказать «почти», потому что есть один или два...

91
Когда лишние круглые скобки влияют, кроме приоритета оператора?

Круглые скобки в C ++ используются во многих местах: например, в вызовах функций и выражениях группировки для переопределения приоритета операторов. Помимо недопустимых дополнительных круглых скобок (например, вокруг списков аргументов вызова функций), общее, но не абсолютное правило C ++ состоит...