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.
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 = 42; // constexpr-function: constexpr int …
Czy istnieje różnica między następującymi definicjami? const double PI = 3.141592653589793; constexpr double PI = 3.141592653589793; Jeśli nie, jaki styl jest preferowany w C ++ 11?
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 }; // do something with the array …
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(); static constexpr char baz[] = …
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 nietrywialny destruktor Czy można użyć std::stringw constexpr? (najwyraźniej …
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: // Constexpr specifier version #include<iostream> #include<cstdlib> constexpr int f(const int x); 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 char* Odwoływanie się do nierozwiązanych externwthrow Czuję, że trochę mi tu brakuje głębi, ale …
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 działa zgodnie z oczekiwaniami, program wypisuje 4 i …
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 przykład: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, …
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 podczas pracy nad godbolt . Jak to się wszystko …
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 mamy całkiem sporo takich globalnych stałych ciągów, chcę zapytać, …
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 std::pair{1.0, 2.0}; // pair of …
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ąś dziwną wadę językową, która uniemożliwia to oznakowanie, ale zapominam …
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.