Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Opracował: Piotr DejaVu Szawdyński
Język C++

constexpr

[słowo kluczowe] Gwarantuje, że wartość zwracana przez funkcję, metodę bądź zmienną jest niezmienna podczas kompilacji.

Opis szczegółowy

Słowo kluczowe constexpr gwarantuje, że wartość zwracana przez funkcję, metodę bądź zmienną jest stała podczas procesu kompilacji.

Funkcje i metody

Użycie constexpr narzuca pewne ograniczenia na budowę funkcji. Ograniczenia te są następujące:
  • funkcja musi zwracać wartość, więc nie może zwracać typu void;
  • funkcja nie może deklarować żadnych zmiennych ani definiować nowych typów danych;
  • ciało funkcji może zawierać tylko deklaracje, puste instrukcje oraz pojedynczą instrukcję return;
  • argumenty funkcji muszą gwarantować, że po ich podstawieniu będzie możliwe otrzymanie wyrażenia o stałej wartości.

Przykład

C/C++
constexpr int dajLiczbe()
{
    return 9;
}

int tablica[ dajLiczbe() + 3 ]; //Utworzy tablicę 12 elementową.

Zmienne

Standard C++11 wprowadził również możliwość definiowania zmiennych ze słowem kluczowym constexpr. Zmienne, które używają słowa kluczowego constexpr muszą zostać zainicjalizowane podczas ich tworzenia wartością stałą lub wyrażeniem, które da wartość stałą.

Przykład 1

C/C++
constexpr double grawitacja_ziemia = 9.8;
constexpr double grawitacja_ksiezyc = grawitacja_ziemia / 6.0;

Przykład 2

C/C++
static const int zmiennaStatyczna = 5;

constexpr const int * dajAdres( const int & zmienna )
{
    return & zmienna;
}

constexpr const int * pStatyczna = dajAdres( zmiennaStatyczna ); //OK (przekazana zmienna posiada zawsze stały adres w pamięci)
constexpr const int * pTymczasowa = dajAdres( 5 ); //Błąd kompilacji (przekazana wartość posiada tymczasowy adres w pamięci)

Konstruktory

Standard C++11 umożliwia także użycie słowa kluczowego constexpr w konstruktorach:

Przykład

C/C++
int zmiennaGlobalna;

struct CKlasa
{
    constexpr CKlasa( bool bUzyjStalej )
        : m_zmienna( bUzyjStalej ? 42
        : zmiennaGlobalna )
    {
    }
    int m_zmienna;
};
constexpr int x1 = CKlasa( true ).m_zmienna; //OK (wyrażenie stałe - wartość 42)
constexpr int x2 = CKlasa( false ).m_zmienna; //Błąd kompilacji (zmienna została zainicjalizowana inną zmienną, która nie jest stała)

Linki zewnętrzne