Ағылшын тілінде оқу

Бөлісу құралы:


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 слово можно использовать в пространстве имен, классе или области блокировки. (Ключевое static_assert слово технически является объявлением, несмотря на то, что оно не вводит новое имя в программу, так как оно может использоваться в области пространства имен.)

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

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

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

C++
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 с областью класса

C++
#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 область блокировки

C++
#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
Объявления и определения