Вопросы с тегом «c++17»

87
Надежны ли экспериментальные возможности современного C ++ для долгосрочных проектов?

У меня есть проект, который в настоящее время использует C ++ 11/14, но для этого требуется что-то вроде того std::filesystem, что доступно только в C ++ 17, и, следовательно, у меня нет возможности его использовать. Однако я вижу, что в моем текущем компиляторе он доступен как...

87
Что такое руководства по выбору шаблонов и когда их следует использовать?

Стандарт C ++ 17 представляет «руководства по выводам шаблонов». Я так понимаю, они как-то связаны с новым выводом аргументов шаблона для конструкторов, представленным в этой версии стандарта, но я еще не видел простого объяснения в стиле FAQ, что они собой представляют и для чего они нужны. Что...

87
std :: ignore со структурированными привязками?

Прелюдия: std::tuple<int, int, int> f(); std::tuple<int, int, float, int> g(); C ++ 1z представит синтаксис для структурированных привязок, который позволит писать вместо int a, b, c; std::tie(a, b, c) = f(); что-то вроде auto [a, b, c] = f(); Однако std::tieтакже можно указать...

86
Почему GCC предупреждает меня о провале, даже когда я использую [[провал]]?

В следующем фрагменте кода я использую стандартный [[fallthrough]]атрибут из C ++ 1z для документирования того, что требуется падение: #include <iostream> int main() { switch (0) { case 0: std::cout << "a\n"; [[fallthrough]] case 1: std::cout << "b\n"; break; } } С GCC 7.1 код...

84
Всегда ли указатель с правильным адресом и типом является действительным указателем, начиная с C ++ 17?

(В отношении этого вопроса и ответа .) До стандарта C ++ 17 в [basic.compound] / 3 было включено следующее предложение : Если объект типа T расположен по адресу A, говорят, что указатель типа cv T *, значением которого является адрес A, указывает на этот объект, независимо от того, как было...

79
Разрешено ли компилятору оптимизировать локальную изменчивую переменную?

Разрешено ли компилятору оптимизировать это (согласно стандарту C ++ 17): int fn() { volatile int x = 0; return x; } к этому? int fn() { return 0; } Если да, то почему? Если нет, то почему? Вот некоторые размышления по этому поводу: текущие компиляторы компилируются fn()как локальная переменная,...

53
Как получить адрес лямбда-функции C ++ внутри самой лямбды?

Я пытаюсь выяснить, как получить адрес лямбда-функции внутри себя. Вот пример кода: []() { std::cout << "Address of this lambda function is => " << ???? }(); Я знаю, что могу перехватить лямбду в переменной и напечатать адрес, но я хочу сделать это на месте, когда эта анонимная...

38
Почему remove_reference не работает с функциями?

Сталкивался с чем-то странным, когда делал шаблонное метапрограммирование на днях. Это в основном сводится к тому, что утверждение не (как я и ожидал) не прошло. static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); Сначала я думал, что допустил синтаксическую...

35
Как сравнить сигнатуру двух функций?

Есть ли способ проверить, имеют ли две функции одинаковую подпись? Например: int funA (int a, int b); int funB (int a, int b); float funC (int a, int b); int funD (float a, int b); В этом примере funAи funBесть единственная комбинация функций, которую следует вернуть...

34
Как инициализировать вектор пар C ++ 17 с необязательным элементом

В C ++ 17, как вы объявляете и инициализируете вектор пар (или кортежей) с необязательным элементом? std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true}, {2, false}, {3, nullptr}}; У меня есть пара, где второй элемент может быть нулевым /...

28
Класс не может получить доступ к своему собственному статическому методу constexpr - ошибка Clang?

Этот код не компилируется в Clang (6,7,8,9, транк), но прекрасно компилируется в GCC (7.1, 8.1, 9.1): template<class T> struct TypeHolder { using type = T; }; template<int i> class Outer { private: template<class T> static constexpr auto compute_type() { if constexpr (i == 42) {...

27
Почему выбрана эта перегрузка оператора преобразования?

Рассмотрим следующий код . struct any { template <typename T> operator T &&() const; template <typename T> operator T &() const; }; int main() { int a = any{}; } Здесь второй оператор преобразования выбирается разрешением перегрузки. Почему? Насколько я понимаю, два...

26
Как я могу создать способ декартово произведение списков типов в C ++?

Самоочевидно. В основном, скажем, у меня есть списки типов, например, так: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; Они могут быть различными числами списков типов. Как я могу...

22
Хранитель shared_ptr хранится в памяти, выделенной пользовательским распределителем?

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

21
Неявное преобразование не допускается при возврате

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

17
Любые ошибки заменить глобальный const char [] на constexpr string_view?

Наша команда работает с базой кода C ++ более 10 лет и недавно перешла на компилятор C ++ 17. Поэтому мы ищем способы модернизировать наш код. В ходе конференции на YouTube я услышал предложение заменить const char*глобальные строки на constexpr string_view. Поскольку const char*в нашем коде есть...