Я использую внешнюю библиотеку C ++, в которой отсутствует константная корректность. Допустим, я работаю с объектами следующего класса:
// Library.h
namespace Library {
class Message {
public:
std::string getData() {
return data_;
}
private:
std::string data_;
};
} // namespace Library
Обратите внимание, что getData()
возвращает копию, поэтому вызов метода не изменяет объект Message
, и он должен быть const
. Однако производитель решил, что это не так. С моей стороны кода важна константная корректность, и Message
должен использоваться в такой функции:
// MyApplication.cpp
template<class T>
void handleMessage(const T& msg) {
std::string content = msg.getData();
// interprete and process content ...
}
Есть ли способ добиться этого? Другими словами, как обойти ошибку error: passing 'const Library::Message' as 'this' argument discards qualifiers
без изменения сигнатуры функции handleMessage
?
const_cast
в крайнем случае. - person user0042   schedule 14.09.2017const
черезconst_cast
в вашей ссылке вызовет неопределенное поведение, если выполняются два условия: (1) исходный конкретный объект фактически былconst
, и (2) объект был изменен. Он не вызывает неопределенное поведение, если любой из них false (как ваш ... на данный момент). В любом случае, это возлагает огромную ответственность на кодировщика, поскольку очень легко намеренно кодировать что-то, что в то время казалось безопасным, только позже, чтобы обнаружить, что кто-то добавил использование, которое передаетconst
объект; компилятор не успел его поймать. - person WhozCraig   schedule 14.09.2017