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

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


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 with 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. Імовірно, це дозволяє паралельні …


2
Стрілка (->) пріоритет / пріоритет оператора найнижча, або пріоритет присвоєння / комбінованого призначення найнижчий?
JLS : Оператор найнижчого пріоритету - стрілка лямбда-виразу (->) , за якою слідують оператори присвоєння. Слідкуйте в якому напрямку (збільшуючи пріоритет, зменшуючи пріоритет)? - "наступний" означає, що призначення має більший пріоритет або нижчий пріоритет (стосовно оператора стрілки)? Гадаю, у збільшенні, тому що "найнижчий" (для стрілки) означає абсолютно найнижчий. Як я …

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

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

1
Чи правильно Кланг відхиляти код, у якому вкладений клас шаблону класу визначається лише за допомогою спеціалізації?
Дано такий шаблон класу: 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 { } але Кланг …

1
Чи може розмір (enum) відрізнятися від sizeof (std :: underlying_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 → цифра | A| …

1
Як компілятори c ++ знаходять зовнішню змінну?
Я складаю цю програму за допомогою 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. Усі конструктори std::ios_baseзахищені. Але …

2
Це програма, яка ніколи не припиняє дійсну програму C ++?
Чи потрібно програму припинити? Іншими словами, це програма, яка працює вічно технічно Undefined Behavior? Зауважте, це не про порожні петлі. Якщо говорити про програми, які назавжди "наповнюють" (тобто спостерігається поведінка). Наприклад, щось подібне: int main() { while (true) { try { get_input(); // calls IO process(); put_output(); // calls IO, …

1
Чому оптимізація порожньої бази заборонена, коли порожній базовий клас також є змінною члена?
Оптимізація порожньої бази чудова. Однак він поставляється із наступним обмеженням: Оптимізація порожньої бази забороняється, якщо одним із порожніх базових класів є також тип або база типу першого нестатичного члена даних, оскільки два базових суб'єкти одного типу повинні мати різні адреси в рамках представлення об'єкта найбільш похідного типу. Щоб пояснити це …

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