const_cast значение для const ref

Я нахожу любопытным, что const_cast не позволяет приводить значение r (например, временную переменную) к квалифицированной ссылке const, хотя оно прекрасно работает со static_cast. У кого-нибудь есть объяснение, почему он так себя ведет?

const_cast< const std::string & >( std::string( "hello" ) ); // doesn't compile
static_cast< const std::string & >( std::string( "hello" ) ); // compiles

Пожалуйста, давайте не будем вдаваться в аргумент «const_cast is evil», здесь я пытаюсь правильно понять те части стандарта C ++, которые касаются const_cast и rvalues.

1

Решение

const_cast указано делать очень конкретные вещи. Он может преобразовывать lvalue в ссылки на lvalue и rvalue в ссылки на rvalue. Он может конвертировать между указателями. Он не может преобразовать из rvalue в lvalue ссылку, даже константную. Прочитайте 5.2.11 для точного перечисления, что может сделать актерский состав; что этот раздел не перечисляет, он не может сделать.

static_cast может делать другие вещи, как указано в 5.2.9. Среди них он может конвертировать из rvalue в lvalue ссылку на const.

3

Другие решения

const_cast можно только добавить или удалить constНесс. Вот и все. Он не может делать никаких других преобразований (в том числе из rvalue в константную lvalue ссылку, которую включает в себя ваш пример кода).

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector