static_assert

Проверяет программное утверждение во время компиляции. Если указано константное выражение false, компилятор отображает указанное сообщение, если он указан, и компиляция завершается ошибкой C2338; в противном случае объявление не действует.

Синтаксис

static_assert( constant-expression, string-literal );

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

Параметры

Константное выражение
Целочисленное константное выражение, которое можно преобразовать в логическое значение. Если вычисляемое выражение равно нулю (false), отображается параметр строкового литерала, а компиляция завершается ошибкой. Если выражение ненулевое (true), static_assert объявление не действует.

Строковый литерал
Сообщение, отображаемое, если параметр констант-выражения равен нулю. Это сообщение представляет собой строку символов в базовом наборе символов компилятора. Это не многобайтовые или широкие символы.

Замечания

Параметр static_assert констант-выражения объявления представляет проверочное утверждение программного обеспечения. Программное утверждение определяет условие, которое должно выполняться на определенном этапе работы программы. Если условие имеет значение true, static_assert объявление не действует. Если условие равно false, утверждение завершается ошибкой, компилятор отображает сообщение в параметре string-литералов , и компиляция завершается ошибкой. В Visual Studio 2017 и более поздних версиях параметр строкового литерала необязателен.

Объявление static_assert проверяет утверждение программного обеспечения во время компиляции. В отличие от этого, макрос и _assert и функции _wassert проверяют утверждение программного обеспечения во время выполнения и влечет за собой затраты на время выполнения в пространстве или времени. static_assert Объявление особенно полезно для отладки шаблонов, так как аргументы шаблона могут быть включены в параметр констант-выражения.

Компилятор проверяет static_assert объявление синтаксической ошибки при обнаружении объявления. Компилятор немедленно вычисляет параметр констант-выражения , если он не зависит от параметра шаблона. В противном случае компилятор вычисляет параметр констант-выражения при создании экземпляра шаблона. Таким образом, компилятор может вывести одно диагностическое сообщение, когда встретит объявление, а второе — когда будет создавать экземпляр шаблона.

Вы можете использовать static_assert ключевое слово в пространстве имен, классе или блоке область. (The static_assert ключевое слово технически является объявлением, хотя он не вводит новое имя в программу, так как его можно использовать в пространстве имен область.)

static_assert Описание область пространства имен

В следующем примере static_assert объявление имеет пространство имен область. Поскольку компилятору известен размер типа void *, выражение вычисляется немедленно.

Пример: static_assert с пространством имен область

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

static_assert Описание класса область

В следующем примере static_assert объявление имеет класс область. Проверяет static_assert , является ли параметр шаблона обычным типом данных (POD). Компилятор проверяет объявление при объявлении, но не вычисляет static_assertпараметр констант-выражения , пока basic_string не будет создан main()экземпляр шаблона класса.

Пример: static_assert с классом область

#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;
}

static_assert Описание блока область

В следующем примере static_assert объявление содержит блок область. Проверяет static_assert , равен ли размер структуры VMPage страниц виртуальной памяти системе.

Пример: static_assert в блоке область

#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.");
    // ...
    }
// ...
};

См. также

Утверждение и сообщения об ошибках, предоставленные пользователем (C++)
Директива #error (C/C++)
Макрос assert, _assert, _wassert
Шаблоны
Набор символов ASCII
Объявления и определения