Для чего нам нужен std :: as_const ()? - PullRequest
0 голосов
/ 23 ноября 2018

C ++ 11 дал нам std::add_const;с C ++ 17 мы имеем новую структуру - std::as_const().Первый просто ставит const перед тем типом, которым вы его предоставляете.Второй - это правильная (шаблон a) функция, а не trait типа, которая, кажется, делает то же самое - за исключением случая, когда тип является rvalue-ссылкой, и в этом случае его нельзя использовать.

Iне совсем понимаю мотивацию для предоставления std::as_const().Зачем нам это нужно в дополнение к std::add_const?

1 Ответ

0 голосов
/ 23 ноября 2018

«Потребность» - это сильное слово ... 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 , Адам Дэвид Алан Мартин и Алисдейр Мередит.

...