static_assert

Testuje asercji oprogramowania w czasie kompilacji. Jeśli określone wyrażenie stałe to false, kompilator wyświetla określony komunikat, jeśli został podany, a kompilacja kończy się niepowodzeniem z błędem C2338; w przeciwnym razie deklaracja nie ma wpływu.

Składnia

static_assert( constant-expression, string-literal );

static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)

Parametry

wyrażenie-stałe
Wyrażenie stałe całkowite, które można przekonwertować na wartość logiczną. Jeśli obliczone wyrażenie ma wartość zero (false), zostanie wyświetlony parametr literału ciągu i kompilacja zakończy się niepowodzeniem z powodu błędu. Jeśli wyrażenie jest niezerowe (true), static_assert deklaracja nie ma wpływu.

literał ciągu
Komunikat wyświetlany, jeśli parametr wyrażenia stałego ma wartość zero. Komunikat jest ciągiem znaków w podstawowym zestawie znaków kompilatora, czyli nie wielobajtowym ani szerokimi znakami.

Uwagi

Parametr wyrażenia stałegostatic_assert deklaracji reprezentuje asercję oprogramowania. Asercji oprogramowania określa warunek, który ma być spełniony w określonym punkcie programu. Jeśli warunek ma wartość true, static_assert deklaracja nie ma wpływu. Jeśli warunek ma wartość false, asercji kończy się niepowodzeniem, kompilator wyświetla komunikat w parametrze literału ciągu, a kompilacja kończy się niepowodzeniem z powodu błędu. W programie Visual Studio 2017 lub nowszym parametr literału ciągu jest opcjonalny.

Deklaracja static_assert testuje asercji oprogramowania w czasie kompilacji. Natomiast asercji Macro i _assert i _wassert funkcje testują asercji oprogramowania w czasie wykonywania i generują koszt czasu wykonywania w przestrzeni lub czasie. Deklaracja jest szczególnie przydatna static_assert do debugowania szablonów, ponieważ argumenty szablonu można uwzględnić w parametrze wyrażenia stałego.

Kompilator sprawdza deklarację pod kątem static_assert błędów składni podczas napotkania deklaracji. Kompilator ocenia parametr wyrażenia stałego natychmiast, jeśli nie zależy od parametru szablonu. W przeciwnym razie kompilator oblicza parametr wyrażenia stałego po utworzeniu wystąpienia szablonu. W związku z tym kompilator może wydać komunikat diagnostyczny po napotkaniu deklaracji i ponownie po utworzeniu wystąpienia szablonu.

Słowo kluczowe można użyć static_assert w przestrzeni nazw, klasie lub zakresie bloku. (Słowo static_assert kluczowe jest technicznie deklaracją, mimo że nie wprowadza nowej nazwy do programu, ponieważ może być używane w zakresie przestrzeni nazw).

Opis zakresu static_assert przestrzeni nazw

W poniższym przykładzie static_assert deklaracja ma zakres przestrzeni nazw. Ponieważ kompilator zna rozmiar typu void *, wyrażenie jest obliczane natychmiast.

Przykład: static_assert z zakresem przestrzeni nazw

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

Opis z zakresem static_assert klasy

W poniższym przykładzie static_assert deklaracja ma zakres klas. Funkcja static_assert sprawdza, czy parametr szablonu jest zwykłym starym typem danych (POD). Kompilator sprawdza deklarację, gdy jest zadeklarowana, ale nie oblicza parametru static_assert wyrażenia stałegodo momentu basic_string utworzenia wystąpienia szablonu klasy w main()pliku .

Przykład: static_assert z zakresem klasy

#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
    static_assert(std::is_pod<CharT>::value,
                  "Template argument CharT must be a POD type in class template basic_string");
    // ...
    };
}

struct NonPOD {
    NonPOD(const NonPOD &) {}
    virtual ~NonPOD() {}
};

int main()
{
    std::basic_string<char> bs;
}

Opis zakresu bloków static_assert

W poniższym przykładzie static_assert deklaracja ma zakres blokowy. Sprawdza static_assert , czy rozmiar struktury vmPage jest równy rozmiarowi strony pamięci wirtualnej systemu.

Przykład: static_assert w zakresie bloku

#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
    struct VMPage { // ...
           };
    int check_pagesize() {
    static_assert(sizeof(VMPage) == PAGESIZE,
        "Struct VMPage must be the same size as a system virtual memory page.");
    // ...
    }
// ...
};

Zobacz też

Potwierdzanie i komunikaty dostarczone przez użytkownika (C++)
#error, dyrektywa (C/C++)
assert Macro, _assert, _wassert
Szablony
Zestaw znaków ASCII
Deklaracje i definicje