Вопросы по теме 'language-lawyer'

Если первый операнд аддитивного выражения может быть преобразован как в указатель, так и в целое число, какое преобразование выбрано?
Какую функцию преобразования следует вызвать в следующем примере? Почему следует предпочесть одно другому? struct A { operator int(); operator int*(); }; A x; int i = x + 1; Компилятор выбирает operator int() .. но почему? Вот...
193 просмотров

Гарантируется ли удаление файла функцией удаления?
Формулировка стандарта C99 кажется немного двусмысленной в отношении поведения функции remove . В разделе 7.19.4.1 параграф 2: Функция remove приводит к тому, что файл, имя которого является строкой, на которую указывает filename ,...
139 просмотров
schedule 31.12.2023

Виртуальные звонки при строительстве/разрушении
Стандарт С++ 12.7/4 говорит: Когда виртуальная функция вызывается прямо или косвенно из конструктора или из деструктора, в том числе во время построения или уничтожения нестатических элементов данных класса, и объект, к которому применяется...
137 просмотров

Как преобразовать дополнение 2 в его соответствующий знаковый аналог, естественный для машины?
Пусть a будет переменной целочисленного типа со знаком T , а U - соответствующим беззнаковым типом. Выражение (U)a дает значение, соответствующее представлению в дополнении до двух значения a как U . Я хочу знать, гарантирует ли стандарт C...
1307 просмотров

Доступ к защищенному конструктору базового класса
Производный класс может вызывать конструктор защищенного базового класса в своем ctor-initializer , но только для своего собственного подобъекта базового класса, а не где-либо еще: class Base { protected: Base() {} }; class Derived : Base...
3213 просмотров
schedule 13.07.2022

Является ли запись в буфер &str[0] (std:string) четко определенным поведением в С++ 11?
char hello[] = "hello world"; std::string str; str.resize(sizeof(hello)-1); memcpy(&str[0], hello, sizeof(hello)-1); Этот код является неопределенным поведением в C++98. Это законно в С++ 11?
19680 просмотров
schedule 19.12.2023

Доступ к члену класса внутри тела функции-члена
Следующий простой пример кода вызывает у меня некоторые сомнения: #include <iostream> using namespace std; struct A { int a; A(int a) { A::a = a; //It is unclear, because in that case we're applying...
101 просмотров
schedule 15.01.2024

Является ли ((void *) 0) константой нулевого указателя?
Я читаю это сообщение в блоге и в разделе Константы нулевого указателя и выражения в скобках автор ссылается на § 6.3.2.3 и § 6.5.1 из стандарта ISO C и говорит: Он не говорит, что константа нулевого указателя в скобках является...
40430 просмотров
schedule 28.06.2022

Законно ли иметь указатель на зарезервированный элемент вектора?
Мне любопытно, законны ли такие вещи: std::vector<some_class_type> vec; vec.reserve(10); some_class_type* ptr = vec.data() + 3; // that object doesn't exist yet Обратите внимание, что я не пытаюсь получить доступ к указанному значению....
702 просмотров

Объем параметров в сложном определении функции
Рассмотрим следующее неясное определение функции, возвращающей указатель на массив char s: char (*func(int var))[sizeof var] { return 0; } Действительно ли это? Сомнительной частью является использование идентификатора var в...
143 просмотров
schedule 31.10.2023

Повторное объявление параметра исключения
В программе мы можем повторно объявить параметр исключения, а также параметр функции следующим образом: #include <exception> void foo() try { throw *new std::exception(); } catch (std::exception e) { extern int e; } int main(){...
77 просмотров
schedule 07.03.2024

Почему 019 не является синтаксической ошибкой JavaScript? Или почему 019 › 020
Если я наберу 019 > 020 в консоли JavaScript (проверено как в Chrome, так и в Firefox), я получу ответ true . Это связано с тем, что 020 интерпретируется как OctalIntegerLiteral . (равно 16 ), тогда как 019 , по-видимому,...
2721 просмотров

Синтаксис явных специализаций шаблонов
Следующее допускается как gcc-4.9.2, так и clang-3.8 при компиляции как C ++ 98 или C ++ 11, #include <cstdio> template <typename T> void f(T) { printf("T\n"); } template <> void f<int>(int) { printf("int\n"); } //...
274 просмотров
schedule 28.07.2022

'goto *foo', где foo не является указателем. Что это?
Я экспериментировал с метками как значениями и в итоге получил этот код. int foo = 0; goto *foo; Мой опыт работы с C/C++ говорит мне, что *foo означает dereference foo и что это не будет компилироваться, потому что foo не является...
1509 просмотров
schedule 02.05.2024

Разрешены ли массивы каламбуров одного типа, но разного размера?
Являются ли каламбурные массивы одного типа, но разного размера нарушением строгого алиасинга? int arr[4]; int(&ref)[2] = reinterpret_cast<int(&)[2]>(arr); arr[0] = 0; //write to original ref[0]; //read from pun
220 просмотров
schedule 30.01.2024

Почему спецификатор mutable классифицируется как спецификатор класса хранения, а не как квалификатор?
Когда спецификатор mutable используется в объявлении нестатического члена данных, данные изменяются независимо от того, рассматривается ли остальная часть объекта как константа. Учитывая этот факт, у нас легко может сложиться впечатление, что...
524 просмотров

Приведение операторов, GCC и clang: какой компилятор правильный?
Рассмотрим следующий код: struct S { using T = int; operator T() { return 42; } }; int main() { S s; S::T t = s; // Is the following line correct? t = s.operator T(); } Он компилируется с помощью GCC (4.9 / 5.1 /...
322 просмотров
schedule 23.10.2022

временные объекты с вариативными аргументами шаблона; еще одна разница g++/clang++
Следующий код struct foo { foo () { } template <typename T0, typename ... Ts> foo (const T0 & t0, const Ts & ... ts) { foo(ts...); } }; int main() { foo f(1, 2); return 0; } компилируется без...
118 просмотров

Что я могу предположить о поведении atoi () при ошибке?
Стандартная функция библиотеки C atoi задокументирована в ISO 9899: 2011 как: 7.22.1 Функции числового преобразования 1 Функции atof , atoi , atol и atoll не должны влиять на значение целочисленного выражения errno при ошибке. Если...
1966 просмотров

T* против char* арифметики указателя
Предположим, у нас есть массив, содержащий N элементов типа T. T a[N]; Согласно стандарту C++14 , при каких условиях мы можем гарантировать, что (char*)(void*)&a[0] + n*sizeof(T) == (char*)(void*)&a[n], (0<=n<N) ?...
718 просмотров
schedule 20.04.2024