static_assert
Testuje výraz softwaru v době kompilace.Pokud zadaný výraz konstanty je false, kompilátor zobrazí zadanou zprávu a kompilace se nezdaří s chybou C2338; jinak deklarace nemá žádný vliv.
static_assert(
constant-expression,
string-literal
);
Parametry
Parametr |
Description |
---|---|
constant-expression |
Integrální konstantní výraz, který lze převést na logickou hodnotu. Pokud vyhodnocený výraz je nula (nepravda), parametr string-literal se zobrazí a kompilace se nezdaří s chybou.Pokud je podmínka nenulová (pravda), prohlášení static_assert nemá žádný vliv. |
string-literal |
Zpráva, která se zobrazí, pokud je parametr constant-expression nula.Zpráva je řetězec znaků v základní znakové sadě kompilátoru. To znamená, že se nejedná o vícebajtové široké znaky. |
Poznámky
Parametr constant-expression prohlášení static_assert představuje softwarové tvrzení.Softwarové tvrzení určuje podmínku, u které očekáváte, že bude true, v určitém místě v aplikaci.Pokud je podmínka pravdivá, prohlášení static_assert nemá žádný vliv.Pokud je podmínka nepravda, výraz se nezdaří, kompilátor zobrazí zprávu v parametru string-literal a kompilace selže s chybou.
Deklarace static_assert testuje kontrolní výraz softwaru v době kompilace.Oproti tomu makro assert (CRT) testuje výraz softwaru za běhu a běh je nákladný na prostor nebo čas.Prohlášení static_assert je zvláště užitečné pro šablony ladění, protože argumenty šablony mohou být součástí parametru constant-expression.
Kompilátor ověří prohlášení static_assert o syntaktických chybách při výskytu prohlášení.Kompilátor vyhodnotí parametr constant-expression okamžitě, pokud není závislý na parametru šablony.V opačném případě kompilátor vyhodnocuje parametr constant-expression při vytváření instance šablony.V důsledku toho kompilátor může zahlásit diagnostickou zprávu jednou při zjištění prohlášení a znovu když je vytvořena šablona instance.
Klíčové slovo static_assert můžete použít v oboru názvů, třídě nebo rozsahu bloku. (Klíčové slovo static_assert je technicky prohlášení, i když nezavádí nové jméno do programu, protože může může být použito v oboru názvů.)
Description
V následujícím příkladu má prohlášení static_assert rozsah oboru názvů.Vzhledem k tomu, že kompilátor zná velikost typu void *, je výraz vyhodnocen ihned.
Příklad
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
Description
V následujícím příkladu má prohlášení static_assert rozsah třídy.static_assert ověřuje, zda je parametr šablony typu obyčejná stará data (POD).Kompilátor zkontroluje prohlášení static_assert při jeho deklaraci, ale nevyhodnotí parametr constant-expression, dokud není pro šablonu třídy basic_string vytvořena instance v main().
Příklad
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(tr1::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;
}
Description
V následujícím příkladu má prohlášení static_assert rozsah bloku.static_assert ověří, zda je velikost struktury VMPage rovna velikosti stránky virtuální paměti systému.
Příklad
#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.");
// ...
}
// ...
};
Viz také
Referenční dokumentace
Kontrolní výraz a uživatelem zadané zprávy (C++)