Ключевое слово auto
может использоваться во многих контекстах и комбинироваться с другими языковыми элементами, как в const auto&
или auto&&
. Однако его нельзя использовать в операциях приведения. Рассмотрим следующий пример (который не компилируется):
template <class T> void foo(T&& t) {}
int main() {
int i = 0;
foo(static_cast<const auto&>(i)); // This could call foo(const int&)
}
Приведение, очевидно, будет работать с int
вместо auto
, но возможность использовать auto
в приведениях будет полезна в общем коде, например:
- Вы можете использовать
const auto&
(как указано выше) для явного вызова перегруженной функции с константным значением ref.
- Аналогично, вы можете использовать
static_cast<auto&&>
как менее подробную версию std::forward<decltype(x)>(x)
.
- Подумав немного дальше,
static_cast<auto>(x)
или что-то вроде auto(x)
может быть способом явного копирования объекта.
(Обратите внимание, что явные типы вместо auto
могут использоваться во всех этих сценариях.)
Если честно, я интуитивно ожидал, что этот синтаксис сработает (потому что он отражает способ использования auto
в объявлениях), но, к моему мягкому удивлению, это не сработало. Поскольку это такой очевидный синтаксис, мне интересно, есть ли конкретные причины, по которым он запрещен? Или это просто случай, когда никто не рассматривает / не предлагает его как особенность?