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.
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() …
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 () { long int res = fib(45); std::cout …
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: …
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 carray[3] = { 0, 1, 2 }; constexpr std::array<int, 3> array{ 0, …
Poniżej znajdują się dwa przypadki testowe dla niezdefiniowanego zachowania, wyrażone jako IIFE (Natychmiastowa wywoływana ekspresja lambda): constexpr auto test3 = []{ int* p{}; { int x{}; p = &x; } return *p; // Undefined Behaviour }(); // IIFE constexpr auto test4 = []{ int x = std::numeric_limits<int>::min(); int y = …
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.