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

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

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

16
std :: pair <auto, auto> тип возвращаемого значения

Я играл с autoв std::pair. В приведенном ниже коде функция fдолжна возвращать std::pairтипы, которые зависят от параметра шаблона. Рабочий пример: Пример 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return...

15
Как компиляторы c ++ находят переменную extern?

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

14
Перегрузка лямбда-функции

Как перегрузить простую локальную лямбда-функцию? SSE оригинальной задачи: #include <iostream> #include <map> void read() { static std::string line; std::getline(std::cin, line); auto translate = [](int idx) { constexpr static int table[8]{ 7,6,5,4,3,2,1,0 }; return table[idx]; }; auto...

14
Является ли разница между двумя экземплярами constexpr указателей __func__ все еще constexpr?

Это действительный C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC и MSVC считают, что все в порядке, Clang считает, что это не так: Compiler Explorer . Все компиляторы соглашаются, что с этим все в порядке: Compiler Explorer . int main() { constexpr auto p = __func__;...

14
Это ошибка в std :: gcd?

Я сталкивался с таким поведением, std::gcdкоторое я нашел неожиданным: #include <iostream> #include <numeric> int main() { int a = -120; unsigned b = 10; //both a and b are representable in type C using C = std::common_type<decltype(a), decltype(b)>::type; C ca = std::abs(a); C cb...

14
Почему std :: swap не работает с векторными элементами <bool> в Clang / Win?

У меня есть такой код: #include <vector> #include <utility> int main() { std::vector<bool> vb{true, false}; std::swap(vb[0], vb[1]); } Аргументы о здравомыслии в vector<bool>стороне, это работало очень хорошо на: Лязг для Mac Visual Studio для Windows GCC для Linux Затем я...

14
GCC9 позволяет избежать бесполезного состояния std :: option?

Недавно я следил за обсуждением Reddit, которое привело к хорошему сравнению std::visitоптимизации по компиляторам. Я заметил следующее: https://godbolt.org/z/D2Q5ED И GCC9, и Clang9 (я полагаю, они используют один и тот же stdlib) не генерируют код для проверки и создания бесполезного исключения,...

13
Почему типы выражений менялись в C ++ между версиями?

Я пытаюсь понять типы выражений C ++, и чем больше я читаю, тем больше я запутался, поскольку нахожу черновик C ++ очень сложным для восприятия и поэтому предпочитаю другие ресурсы, но они либо противоречат друг другу, либо не учитывают, что формулировка и определение между версиями C ++ сильно...

13
Как работает реализация C ++ nullptr?

Мне любопытно узнать, как nullptrработает. Стандарты N4659 и N4849 гласят: он должен иметь тип std::nullptr_t; вы не можете взять его адрес; это может быть непосредственно преобразовано в указатель и указатель на член; sizeof(std::nullptr_t) == sizeof(void*); его преобразование в boolесть false;...

13
если constexpr с static_assert в лямбде, какой компилятор правильный?

Когда мы хотим использовать a static_assertв a, if constexprмы должны сделать условие зависимым от некоторого параметра шаблона. Интересно, что gcc и clang не согласны, когда код обернут в лямбду. Следующий код компилируется с помощью gcc, но clang запускает утверждение, даже если значение if...

13
Неоднозначный оператор в gcc

Я сделал шаблон функции для печати некоторых контейнеров stl #include <iostream> #include <vector> #include <string> template <template <typename, typename> class C, typename T, typename A> std::ostream& operator<<(std::ostream& os, const C<T,...

12
Возможное неопределенное поведение в примитивной реализации static_vector

tl; dr: я думаю, что мой static_vector имеет неопределенное поведение, но я не могу его найти. Эта проблема на Microsoft Visual C ++ 17. У меня есть эта простая и незавершенная реализация static_vector, то есть вектор с фиксированной емкостью, который может быть выделен в стеке. Это программа C ++...

12
Можно ли объединить две строки типа `const char *` во время компиляции?

Очевидно, что мы можем объединить два строковых литерала в constexprфункции, но как насчет объединения строкового литерала со строкой, возвращенной другой constexprфункцией, как в коде ниже? template <class T> constexpr const char * get_arithmetic_size() { switch (sizeof(T)) { case 1: return...

12
Стандартно ли гарантировано, что лямбда без захвата будет пустой?

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

11
Можно ли изменить встроенную переменную после инициализации в C ++ 17?

Мой сценарий следующий (он работал в Clang, но не в GCC) liba.hpp: inline int MY_GLOBAL = 0; libother.cpp: (dll) #include "myliba.hpp" void myFunc() { // MYGLOBAL = 28; } someexe.cpp: RunAppThatUsesBothLibAandLibOther(); Проблема в том, что встроенная переменная показывала 0 в тех местах, где я...

11
Могу ли я использовать std :: transform вместо политики параллельного выполнения?

Если я не ошибаюсь, я могу заставить std::transformработать на месте , используя тот же диапазон, что и итератор ввода и вывода. Предположим, у меня есть какой-то std::vectorобъект vec, тогда я бы написал std::transform(vec.cbegin(),vec.cend(),vec.begin(),unary_op) используя подходящую унарную...

11
Неквалифицированный sort () - почему он компилируется при использовании на std :: vector, а не на std :: array, и какой компилятор корректен?

При звонке std::sort()на std::array: #include <vector> #include <array> #include <algorithm> int main() { std::vector<int> foo{4, 1, 2, 3}; sort(begin(foo), end(foo)); std::array<int, 4> foo2{4, 1, 2, 3}; sort(begin(foo2), end(foo2)); } И gcc, и clang возвращают ошибку...