«Потребность» - это сильное слово ... std::as_const
существует, потому что это полезно, а не строго необходимо.Поскольку это скорее функция, чем черта, мы можем использовать ее для «добавления констант» к фактическим значениям , а не к типам .
Более конкретно: предположим, у меня естьнекоторая переменная my_value
, и я хочу трактовать ее как const
, но не копировать ее.До C ++ 17 мне нужно было бы написать:
static_cast<const MyType&>(my_value)
, и если я не хочу указывать тип явно, это будет:
static_cast<std::add_const_t<std::remove_reference_t<decltype(my_value)>> &>(my_value)
или если вы хотитечтобы опуститься и испачкаться, и использовать кастинг в стиле C:
(const decltype(my_value) &) (my_value)
, все это раздражает и многословно.
Вместо этого в C ++ 17 теперь пишут std::as_const(my_value)
, и это все, что нужно.
Примечания:
Эта функцияотключено для ссылок rvalue, хотя для них это работает просто отлично.Причина в том, чтобы помочь вам избежать непреднамеренного сохранения ссылки на временное прошлое его уничтожения.Как объясняет @NicolBolas, если вы напишите что-то вроде:
for(auto &x : std::as_const(returns_container())) { /* do stuff with x */ }
, то время жизни возвращаемого контейнера заканчивается до первой итерации цикла.Очень легко пропустить!
За дополнительной (?) Информацией обращайтесь к официальному предложению этой служебной функции: P007R1 , Адам Дэвид Алан Мартин и Алисдейр Мередит.