static_assert
Свернуть оглавление
Развернуть оглавление
Чтобы прочитать статью на английском языке, установите флажок Английский. Вы также можете просматривать текст на английском языке во всплывающем окне, наводя указатель мыши на текст.
Перевод
Английский

static_assert

 

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

static_assert( 
    constant-expression, 
    string-literal 
);

Параметр

Описание

constant-expression

Целочисленное константное выражение, которое можно преобразовать в логическое значение.

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

строковый литерал

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

Параметр constant-expression в объявлении static_assert представляет собой программное утверждение.  Программное утверждение определяет условие, которое должно выполняться на определенном этапе работы программы.  Если условие истинно, то объявление static_assert не имеет силы.  Если условие ложно, то утверждение не выполняется, компилятор выводит сообщение в параметре string-literal и компиляция завершается ошибкой.  

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

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

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

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

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

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

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

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

#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.");
    // ...
    }
// ...
};
Показ:
© 2016 Microsoft