Должен ли static_assert запускаться с определением типа?

Я заметил, что статические утверждения в шаблонах классов не запускаются, когда экземпляры typedef'ed.

#include <type_traits>

template <typename T>
struct test_assert
{
    static_assert( std::is_same< T, int >::value, "should fail" );
};

typedef test_assert< float > t;

Этот код компилируется без ошибок. Если я попытаюсь создать экземпляр, то утверждение завершится ошибкой:

t obj; // error: static assertion failed: "should fail"

Наконец, если я заменю условие на false, утверждение завершится ошибкой, даже если я не создам экземпляр шаблона класса:

template <typename T>
struct test_assert
{
    static_assert( false, "always fails" );
};

I попробовал этот код на gcc-4.5.1 и gcc-4.7.0. Это нормальное поведение? В какое время компилятор должен проверять статические утверждения? Я предполагаю, что задействован двухэтапный поиск, но разве typedef не должен запускать вторую фазу?

5
задан Luc Touraille 28 June 2012 в 19:29
поделиться