Я пытаюсь запретить ссылки на класс, который у меня есть, и я вижу странное поведение. Я построил игрушечный пример, который показывает, что происходит. Если у меня есть это:Требуется ли static_assert использовать параметр шаблона?
template <class T>
struct something {
};
template <class T>
struct something<T&> {
static_assert(false, "reference disallowed with something");
};
int main() {
something<int> a; (void)a;
}
Даже если я не объявляя экземпляр чего-то со ссылкой, он до сих пор не удается:
> g++ -std=c++11 foo.cc -o foo
foo.cc:7:5: error: static assertion failed: reference disallowed with something
static_assert(false, "reference disallowed with something");
^
Если я настроить его так, что он должен использовать шаблон параметр через прокси-класс, то он работает:
template <class T>
struct something {
};
template <class T>
struct something<T&> {
template <class TT> struct falsity {
static const bool value = false;
};
static_assert(falsity<T>::value, "reference disallowed with something");
};
int main() {
something<int> a; (void)a;
}
Тогда это работает просто отлично, это ожидаемое поведение? Я бы подумал, что static assert будет членом класса независимо.
Edit: это GCC версии 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
Короче: Нет! Попробуйте 'static_assert (false,« Это false ».);' –
@ πάντα ῥεῖ: Я не уверен, что понимаю, вы не думаете, что это ожидаемое поведение? Где я должен попытаться утверждать? –
_ «Где я должен попытаться утверждать?» _ В другом месте. Точка: ** Это не требует использования параметров шаблона. ** –