Я заметил, что статические утверждения в шаблонах классов не запускаются, когда экземпляры 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 не должен запускать вторую фазу?