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

Для вопросов о тонкостях формальных или авторитетных спецификаций языков программирования и сред.

3
Хранитель shared_ptr хранится в памяти, выделенной пользовательским распределителем?
Скажем, у меня есть shared_ptrпользовательский распределитель и пользовательский удалитель. Я не могу найти в стандарте ничего, что говорит о том, где должен храниться удалитель: он не говорит, что пользовательский распределитель будет использоваться для памяти удалителя, и не говорит, что этого не будет. Это не указано или я просто что-то упустил?

2
Является ли тип POD в точности эквивалентным тривиальному типу стандартной компоновки?
В C ++ 20 концепция POD устарела, предположительно потому, что это бессмысленная составная черта тривиальности и стандартной компоновки. Однако определение POD в проекте C ++ 20 не совсем «тривиально и стандартно»; это на самом деле: Класс POD - это класс, который является как тривиальным классом, так и классом стандартной компоновки …


4
Неявное преобразование не допускается при возврате
#include <optional> bool f() { std::optional<int> opt; return opt; } Не компилируется: 'return': cannot convert from 'std::optional<int>' to 'bool' Консультационная справка Я бы подумал найти объяснение, но я прочитал его, как должно быть в порядке. Неявные преобразования выполняются всякий раз, когда выражение некоторого типа T1 используется в контексте, которое не …

1
Почему {} в качестве аргумента функции не приводит к двусмысленности?
Рассмотрим этот код: #include <vector> #include <iostream> enum class A { X, Y }; struct Test { Test(const std::vector<double>&, const std::vector<int>& = {}, A = A::X) { std::cout << "vector overload" << std::endl; } Test(const std::vector<double>&, int, A = A::X) { std::cout << "int overload" << std::endl; } }; int …

4
Допустимо ли использовать std :: transform с std :: back_inserter?
Cppreference имеет этот пример кода для std::transform: std::vector<std::size_t> ordinals; std::transform(s.begin(), s.end(), std::back_inserter(ordinals), [](unsigned char c) -> std::size_t { return c; }); Но это также говорит: std::transformне гарантирует применение в порядке unary_opили binary_op. Чтобы применить функцию к последовательности по порядку или применить функцию, которая изменяет элементы последовательности, используйте std::for_each. Предположительно, это …

3
Является ли значение указателя `this` постоянным в течение всего времени существования объекта?
thisГарантируется ли значение указателя постоянным в течение жизни определенного объекта? Я не могу представить себе случай, когда это изменится, но не знаю, не пропустил ли я что-то.

2
Стрелка (->) приоритет оператора / приоритет самый низкий, или приоритет назначения / комбинированное назначение самый низкий?
JLS : Оператор с наименьшим приоритетом - стрелка лямбда-выражения (->) , за которой следуют операторы присваивания. В каком направлении следовали (увеличение приоритета, уменьшение приоритета)? - «сопровождается» означает, что присвоение имеет более высокий или более низкий приоритет (по отношению к оператору стрелки)? Я думаю, при увеличении, потому что «низший» (для стрелки) …

2
Прыжки через переменную инициализации плохо сформированы или это вызывает неопределенное поведение?
Рассмотрим этот код: void foo() { goto bar; int x = 0; bar: ; } GCC и Clang отклоняют это , потому что переход к bar:обходу инициализации переменной. MSVC вообще не жалуется (кроме случаев, xкогда bar:вызывает предупреждение). Мы можем сделать аналогичную вещь с switch: void foo() { switch (0) { …

1
Почему стандарт C ++ обрабатывает файл в поисках так, как он это делает?
C ++ использует streamoffтип для представления смещения внутри (файлового) потока и определяется следующим образом в [stream.types]: using streamoff = implementation-defined ; Тип streamoff является синонимом одного из подписанных базовых целочисленных типов достаточного размера, чтобы представить максимально возможный размер файла для операционной системы. 287) 287) Обычно длинные длинные. Это имеет смысл, …

1
Правильно ли Clang отклонять код, в котором вложенный класс шаблона класса определяется только через специализации?
Дан следующий шаблон класса: template<typename T> struct Outer { struct Inner; auto f(Inner) -> void; }; мы определяем Innerотдельно для каждой специализации Outer: template<> struct Outer<int>::Inner {}; template<> struct Outer<double>::Inner {}; а затем определить функцию-член fодин раз для всех специализаций Outer: auto Outer<T>::f(Inner) -> void { } но Кланг (9.0.0) …

1
Может ли sizeof (enum) отличаться от sizeof (std :: under_type <Enum> :: type)?
Недавно появился обзор кода, который в следующем примере: enum class A : uint8_t { VAL1, VAL2 }; ... std::vector&lt;A&gt; vOfA; // Assume this is sized and full of some stuff. std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A)); Мы должны использовать sizeof(std::underlying_type&lt;A&gt;::type)вместо sizeof(A). Возможно ли, что они могут отличаться? У кого-то есть стандартная …

1
Должен ли анализатор Haskell разрешать цифры Unicode в числовых литералах?
В качестве упражнения я пишу парсер для Haskell с нуля. Создавая лексер, я заметил следующие правила в отчете Haskell 2010 : цифра → ascDigit | uniDigit ascDigit → 0| 1| … | 9 uniDigit → любая десятичная цифра Unicode октит → 0| 1| … | 7 hexit → цифра | …

1
Как компиляторы c ++ находят переменную extern?
Я компилирую эту программу с помощью g ++ и clang ++. Есть разница: g ++ печатает 1, а clang ++ печатает 2. Кажется, что g ++: внешняя переменная определена в самой короткой области видимости. clang ++: внешняя переменная определена в самой короткой глобальной области видимости. Есть ли в C ++ …

2
Почему у `std :: basic_ios` есть открытый конструктор?
std::basic_iosимеет открытый конструктор : explicit basic_ios (std::basic_streambuf&lt;CharT,Traits&gt;* sb); IMO, единственная причина, по которой у класса есть открытый конструктор, - это использование автономного экземпляра этого класса в программе. Если класс существует только для того, чтобы другие классы происходили от него (как, кажется, имеет место basic_ios), все конструкторы класса должны быть protected. …

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.