Запитання з тегом «c++20»

C ++ 20 - ціль для версії C ++ після C ++ 17. Цей тег слід використовувати (разом із тегом C ++) для запитань щодо функцій C ++, відстежуваних для C ++ 20.

3
std :: bit_cast з std :: масивом
У своїй нещодавній бесіді «Тип покарання в сучасному C ++» Тимур Домлер сказав, що std::bit_castйого неможливо використати для введення біт floatв «a», unsigned char[4]оскільки масиви стилю C не можуть бути повернуті з функції. Ми повинні або використовувати, std::memcpyабо чекати, поки C ++ 23 (або пізніше), коли щось подібне reinterpret_cast<unsigned char*>(&f)[i]стане …

1
Чому типи виразів змінювались у C ++ між версіями?
Я намагаюся зрозуміти типи виразів C ++ і чим більше я читаю, тим я був більш розгубленим, оскільки мені здається, що проект C ++ дуже важкий для засвоєння, і тому віддаю перевагу іншим ресурсам, але вони або суперечать один одному, або не враховують, що формулювання та визначення між версіями C …
13 c++  c++11  c++14  c++17  c++20 

1
Чи потрібна `рівність_порівнянний_з`, вимагає "загальної_посилання"?
Концепціяequality_­comparable_with<T, U> покликана заявити , що об'єкти типу Tі Uможуть бути порівняні рівні один одному, і якщо вони є, то це має очікуваний сенс. Це добре. Однак це поняття також вимагає common_reference_t<T&, U&>існування. Основним поштовхом до common_referenceта його супутньої функціональності, здається, є можливість ввімкнути проксі-ітератори , мати місце для представлення …

1
C ++ 20 визначення поза класу в шаблоновому класі
До C ++ 20 стандарту C ++, коли ми хотіли визначити позакласного оператора, який використовує деякі приватні члени шаблонного класу, ми будемо використовувати конструкцію, подібну до цього: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr …
12 c++  templates  c++20 

1
Чи гарантовано незаймана лямбда буде порожньою за стандартом?
Я шукаю спосіб ідентифікувати порожні (без захоплення) лямбда від інших лямбда в функції шаблону. Зараз я використовую C ++ 17, але мені цікаво і відповідей на C ++ 20. Мій код виглядає приблизно так: template<typename T> auto func(T lambda) { // The aguments of the lambdas are unknown if constexpr …
12 c++  lambda  c++17  c++20 

1
Як менеджери пакунків Linux оброблять модулі C ++ 20?
Зараз ми в 2020 році, і C ++ 20 приходить разом із довгоочікуваною функцією модулів C ++. Але переглянувши кілька розмов про CppCon, я виявив, що модулі C ++ знаходяться в дивному місці, особливо для менеджерів пакетів Linux (pacman, apt, emerge тощо). З того, що я дізнався, є модулі C …

1
Що запобігає перекриттю сусідніх членів у класах?
Розглянемо наступні три structs: class blub { int i; char c; blub(const blub&) {} }; class blob { char s; blob(const blob&) {} }; struct bla { blub b0; blob b1; }; На типових платформах, де intрозміщено 4 байти, розміри, вирівнювання та загальна заливка 1 є такими: struct size alignment …

2
Передача поняття функції
Оскільки поняття визначені як предикати часу компіляції, чи можливо також реально використовувати ці предикати для алгоритмів часу компіляції? Наприклад, чи можна було б перевірити, чи всі типи в кортежі відповідають поняттю? Наскільки я бачив, неможливо жодним чином передати поняття функції, що призводить мене до використання шаблонів для цих випадків. #include …

1
Чи можуть існувати різні неявні об'єкти, засновані на більш пізньому рішенні виконання у C ++ 20?
Це питання стосується доповнення P0593 до останнього проекту C ++ 20 . Ось мій приклад: #include <cstdlib> #include <cstdio> void foo(void *p) { if ( std::getchar() == 'i' ) { *(int *)p = 2; std::printf("%d\n", *(int *)p); } else { *(float *)p = 2; std::printf("%f\n", *(float *)p); } } int …

4
Порушення зміни C ++ 20 або регресія в clang-trunk / gcc-trunk при перевантаженні порівняння рівності з не булевим значенням повернення?
Наступний код добре поєднує кланг-магістраль у режимі c ++ 17, але розривається в режимі c ++ 2a (майбутні c ++ 20): // Meta struct describing the result of a comparison struct Meta {}; struct Foo { Meta operator==(const Foo&) {return Meta{};} Meta operator!=(const Foo&) {return Meta{};} }; int main() { …

1
Чи може проміжок бути constexpr?
Усі конструктори std :: span оголошені constexpr, однак я не можу змусити жодного з них працювати в контексті constexpr. Якщо коментувати будь-який з contexpr нижче, це призведе до помилки компіляції. #include <array> #include <span> int main() { constexpr int carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ …
11 c++  constexpr  c++20 

1
Чому в std :: span відсутні оператори порівняння?
Хіба не std::spanрозроблена як легка посилання на субрегіони std::vector/ std::array/ простого масиву тощо? Чи не повинен він також містити операторів порівняння у своєму API, щоб вони відповідали їм? Які міркування за виключенням? Примітка: оператори порівняння, я маю в виду або повний набір ( <, <=, ...) або космічний корабель<=>
10 c++  std  c++20  std-span 

1
Чи дозволена арифметика вказівника на виділеному сховищі, оскільки C ++ 20?
У стандарті C ++ 20 сказано, що типи масивів - це неявний тип життя . Чи означає це, що масив до неявного типу життя може бути неявно створений? Неявне створення такого масиву не спричинило б створення елементів масиву? Розглянемо цей випадок: //implicit creation of an array of std::string //but not …

1
Чи зможемо ми сконструювати контейнери з видами в C ++ 20?
Діапазон виходить на C ++ зі стандартною версією C ++ 20. Моє запитання: Чи зможемо ми побудувати (існуючі) стандартні бібліотечні контейнери з будь-яким діапазоном? І що ще важливіше, з видом діапазону? Наприклад, чи буде це: #include <vector> #include <iostream> #include <ranges> int main() { auto sq = [](int x) { …
10 c++  c++20  range-v3 

1
Чи дозволено виразів, щоб "захоплювати" змінні змістовної області?
У наступному прикладі аргументи функції використовуються для тестування з необхідним вираженням, чи добре сформований вираз з їх допомогою. Вираз, що вимагає, не має аргументів; він безпосередньо використовує змінні в області функцій: #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) …

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