Я нахожу любопытным, что 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.
const_cast
указано делать очень конкретные вещи. Он может преобразовывать lvalue в ссылки на lvalue и rvalue в ссылки на rvalue. Он может конвертировать между указателями. Он не может преобразовать из rvalue в lvalue ссылку, даже константную. Прочитайте 5.2.11 для точного перечисления, что может сделать актерский состав; что этот раздел не перечисляет, он не может сделать.
static_cast
может делать другие вещи, как указано в 5.2.9. Среди них он может конвертировать из rvalue в lvalue ссылку на const.
const_cast
можно только добавить или удалить const
Несс. Вот и все. Он не может делать никаких других преобразований (в том числе из rvalue в константную lvalue ссылку, которую включает в себя ваш пример кода).