Jaka jest różnica między constexpri const? Kiedy można używać tylko jednego z nich? Kiedy mogę korzystać z obu tych opcji i jak wybrać jedną z
constexpr to modyfikator wprowadzony w C ++ 11, który informuje kompilator, że wartość funkcji lub zmiennej jest znana lub może zostać obliczona w czasie kompilacji. W związku z tym może być używany jako stała w miejscach, w których inaczej by nie było.
Jaka jest różnica między constexpri const? Kiedy można używać tylko jednego z nich? Kiedy mogę korzystać z obu tych opcji i jak wybrać jedną z
Wydaje mi się, że posiadanie „funkcji, która zawsze zwraca 5”, łamie lub osłabia znaczenie „wywoływania funkcji”. Musi być jakiś powód lub potrzeba takiej możliwości, inaczej nie byłoby w C ++ 11. Dlaczego tam jest // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife...
Jeśli mam zmienną wewnątrz funkcji (powiedzmy, dużą tablicę), czy sens ma deklarowanie jej jednocześnie statici constexpr? constexprgwarantuje, że tablica jest tworzona w czasie kompilacji, więc czy staticbyłaby bezużyteczna? void f() { static constexpr int x [] = { // a few thousand elements...
Chcę mieć static const chartablicę w mojej klasie. GCC narzekało i powiedziało mi, że powinienem skorzystać constexpr, chociaż teraz mówi mi, że to niezdefiniowane odniesienie. Jeśli ustawię tablicę jako nie będącą członkiem, wówczas się kompiluje. Co się dzieje? // .hpp struct foo { void bar();...
Używając C ++ 11, Ubuntu 14.04, domyślnego łańcucha narzędzi GCC . Ten kod nie działa: constexpr std::string constString = "constString"; błąd: typ 'const string {aka const std :: basic_string}' zmiennej constexpr 'constString' nie jest dosłowny ... ponieważ ... 'std :: basic_string' ma...
Rozważ następującą wbudowaną funkcję: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } i odpowiednik w wersji constexpr: //...
Na samym końcu wystąpienia Scotta Schurra „Wprowadzenie constexpr” na CppCon pyta „Czy istnieje sposób na zatrucie funkcji”? Następnie wyjaśnia, że można to zrobić (choć w niestandardowy sposób) poprzez: Umieszczenie throww constexprfunkcji Deklarowanie nierozwiązanego problemu extern const...
Próbuję obliczyć długość literału ciągu w czasie kompilacji. Aby to zrobić, używam następującego kodu: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh")); } Wszystko...
Gdzie powinienem preferować używanie makr, a gdzie powinienem preferować constexpr ? Czy nie są w zasadzie takie same? #define MAX_HEIGHT 720 vs constexpr unsigned int max_height = 720;
Mam funkcję, która przyjmuje wielowymiarowość std::vectori wymaga podania głębokości (lub liczby wymiarów) jako parametru szablonu. Zamiast na stałe wpisywać tę wartość, chciałbym napisać constexprfunkcję, która pobierze std::vectori zwróci głębokość jako unsigned integerwartość. Na...
TL; DR Zanim spróbujesz przeczytać cały ten post, wiedz, że: znalazłem rozwiązanie dla przedstawionego problemu , ale wciąż chętnie wiem, czy analiza jest poprawna; Spakowałem rozwiązanie do fameta::counterklasy, która rozwiązuje kilka pozostałych dziwactw. Możesz go znaleźć na github ; widać to...
Nasz zespół pracuje z ponad 10-letnią bazą kodu C ++, a ostatnio przeszedł na kompilator C ++ 17. Szukamy więc sposobów modernizacji naszego kodu. Podczas konferencji na YouTube usłyszałem sugestię zastąpienia const char*globalnych ciągów constexpr string_view. Ponieważ const char*w naszym kodzie...
Grałem około z autow std::pair. W poniższym kodzie funkcja fpowinna zwracać std::pairtypy zależne od parametru szablonu. Przykład roboczy: PRZYKŁAD 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S == 2) return...
W GCC 10 bawiłem się konstelacją c ++ 20 i napisałem ten kod #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred,...
Czy to jest poprawny C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC i MSVC uważają, że jest w porządku, Clang uważa, że tak nie jest: Compiler Explorer . Wszystkie kompilatory zgadzają się, że ten jest w porządku: Eksplorator kompilatorów . int main() {...
W C ++ 20 std::swapstaje się constexprfunkcją. Wiem, że standardowa biblioteka naprawdę pozostawała w tyle za językiem w oznaczaniu rzeczy constexpr, ale do 2017 r. <algorithm>Była prawie niezrozumiała, podobnie jak wiele innych rzeczy. A jednak - std::swapnie było. Niejasno pamiętam jakąś...
Próbowałem wyrażeń stałych, które są oceniane podczas kompilacji. Ale bawiłem się przykładem, który wydaje się niewiarygodnie szybki, gdy jest wykonywany w czasie kompilacji. #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); } int main ()...
Czy następujący kod jest prawidłowy? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clang to akceptuje, ale GCC i MSVC to odrzucają. Błąd GCC to: main.cpp:15:18: error:...
Wszystkie konstruktory std :: span są zadeklarowane jako constexpr, jednak nie wydaje się, aby którykolwiek z nich działał w kontekście constexpr. Odznaczenie któregokolwiek z poniższych constexpr spowoduje błąd kompilacji. #include <array> #include <span> int main() { constexpr int...