Этот код не выдает ошибку, но предупреждение. На мой взгляд, здесь полезно. Предупреждения - это то, что вы можете игнорировать, но в этом случае важно сделать следующее замечание: dynamic_cast
тип в его базовый класс никогда не вернет NULL
, и, поскольку это ссылочный тип, компилятор ожидает его не является указателем NULL
, когда вы берете его адрес.
Этот код:
if (std::is_same<Base, T>::value) {
return true;
} else {
return dynamic_cast<const Base*>(&object) != nullptr;
}
... компилируется, потому что теперь вы представляете ситуацию, когда dynamic_cast
действительно может вернуть вам NULL
, так как приведение к Base
может оказаться невозможным. Это верно, что G ++ не предупредил вас здесь.
Для меня это ситуация, когда GCC выдает вам более полные предупреждения, чем Clang, а не ситуация, когда GCC недостаточно, сообщая вам о коде, который не будет выполняться при определенных экземплярах шаблона.