mTestObj
является указателем, поэтому
(const Types::String&)mTestObj
нельзя интерпретировать как static_cast<const Types::String&>(mTestObj)
, потому что нет конструктора Types::String
, который принимает Types::String*
.
Таким образом, он будет интерпретирован как
reinterpret_cast<const Types::String&>(mTestObj)
, который имеет то же значение, что и
*reinterpret_cast<const Types::String*>(&mTestObj)
, поскольку по адресу mTestObj
(указатель) нет объекта Types::String
, доступ к результату этого приведения, как будто есть причины, вызывает неопределенное поведение. Это происходит в конструкторе копирования std::string
. В качестве альтернативы, результат приведения может быть уже не указан, если есть несоответствие выравнивания для Types::String
.
Не используйте приведение в стиле C, так как вы можете видеть, что они очень опасны.
Вы получаете ссылку из указателя, используя *
, и вы можете получить ссылку const
, позвонив по номеру std::as_const
:
Types::String new_string(std::as_const(*mTestObj));
, хотя я не уверен, зачем вам нужен const
во-первых, так что, вероятно, вы действительно хотите просто
Types::String new_string(*mTestObj);