Jestem nowy w programowaniu i zacząłem się uczyć o tym przy użyciu książki Zasady programowania i ćwiczenia z wykorzystaniem C++. Dzisiaj jestem tutaj, ponieważ mam pewne problemy w zrozumieniu funkcji constexpr
. W rozdziale 8 autor wprowadza je w niektórych liniach i krótki przykład używając tych słów:Przekazywanie argumentów do funkcji constexpr
Funkcja reprezentuje obliczenia, a czasami chcemy wykonać obliczenia w czasie kompilacji. Powodem, dla którego obliczenie powinno być obliczone przez kompilator, jest zwykle unikanie tych samych obliczeń co miliony razy w czasie wykonywania.
Przekazujemy, że zamierzamy mieć funkcję ocenianą podczas kompilacji, deklarując funkcję jako funkcję
constexpr
. Funkcjęconstepxr
można oszacować w czasie kompilacji, tylko jeśli jako argumenty podano jej wyrażenia stałe.constexpr double xscale = 10; // scaling factors constexpr double yscale = 0.8; constexpr Point scale(Point p) { return { xscale*p.x, yscale*p.y }; };
Załóżmy, że punkt jest prostą strukturą z członami x i y reprezentującymi współrzędne 2D. Teraz, gdy podamy
scale()
argument o wartościscale()
, zwraca on punkt o współrzędnych skalowanych zgodnie z czynnikamixscale
iyscale
. Na przykład:void user(Point p1) { Point p2{10,10}; Point p3 = scale(p1); Point p4 = scale(p2) // p4 == {100,8} constexpr Point p5 = scale(p1); // error : scale(p1) is not a constant expression constexpr Point p6 = scale(p2); // p6 == {100,8};
Moje pytanie brzmi: Dlaczego możemy użyć p2
jako argument do scale()
? Czy p2
jest traktowane jako wyrażenie stałe? A jeśli tak, dlaczego?
Czy elementy danych x
i y
można uznać za wyrażenia stałe?
Moja książka nie podaje zbyt wielu informacji, więc mam pewne problemy z tą koncepcją.
Funkcja 'constexpr' nie * nie * wymaga, aby jej argumenty były wyrażeniami stałymi. To może być powszechne nieporozumienie. Jeśli wywołujesz taką funkcję z niestanowiącymi stałych argumentów, wynik jest również nie stały. Zasadniczo wyrażenie "funkcja constexpr" jest trochę mylące. Funkcja * 'foo' nie jest' constexpr' - * aplikacja * funkcji, 'foo (x, y)', jest stała jeśli i tylko jeśli 'x' i' y' są stałe –