В ряде случаев static_cast
может помочь уменьшить как неоднозначности компилятора, так и неоднозначности читателя при использовании с auto
.
В частности, при рассмотрении std::vector<bool>
в примере, я могу подумать из двух таких случаев:
- Если бы это было передано в шаблон функции, который выводит аргумент, вы бы скорее
decltype(a)
предпочли бы bool
, чем какой-то тип std::__vector_bool_reference_wrapper
, или - Если
a
были переданы функции с сигнатурой, которая принимает bool&
или bool*
, вы бы хотели, чтобы это был правильный тип - поскольку неявные преобразования не произойдут
Приведенные выше случаи относятся ко всему, что может иметь неявные преобразования, а не только к bool
/ reference-wrapper.
Кроме того, дела становятся более интересными с другими типами.
Указатели:
nullptr
имеет тип decltype(nullptr)
, который также называется псевдонимом std::nullptr_t
. Это не любого типа T*
. Это означает, что вы не можете написать такой код, как:
auto p = nullptr;
...
p = &a; // compile-error!
Но вместо этого потребуется:
auto p = static_cast<T*>(nullptr);
...
p = &a; // works!
Непреднамеренные рекламные акции
Непреднамеренные рекламные акции могут производить неожиданные ошибки. Если код использует auto
и полагается на целочисленное переполнение, без явного указания на типы, можно непреднамеренно произвести целочисленное продвижение - что может предотвратить возникновение этого переполнения. Это может привести к незначительным ошибкам в некотором коде.
То же самое, вероятно, возможно с продвижением float
/ double
, хотя мне труднее думать о случае, когда такой случай будет отрицательным.
Непреднамеренные повышения могут также вызывать сбои компиляции, если результат передается функции, которая ожидает ссылку или указатель на T
другого типа, чем продвигаемый тип (аналогично примеру vector<bool>
выше).
Я уверен, что существуют другие случаи, когда static_cast
значимо при использовании с auto
, но в целом случаи, которые приходят на ум, имеют дело со строгой типизацией, которая идет с перегрузкой разрешение и вычет типа шаблона.
Кроме этого, могут также быть случаи, когда static_cast
просто помогает общей читаемости сложных функций, которые используют много auto