【发布时间】:2017-09-14 09:22:32
【问题描述】:
我正在使用缺乏 const 正确性的外部 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 ...
}
有没有办法做到这一点?换句话说,如何在不更改handleMessage 函数签名的情况下解决error: passing 'const Library::Message' as 'this' argument discards qualifiers 错误?
【问题讨论】:
-
你可以使用
const_cast作为最后的手段。 -
请注意,在您的引用上通过
const_cast剥离const将调用 未定义的行为,如果有两件事成立:(1) 实际上,原始的具体对象是,const, 和 (2) 对象被修改。如果 其中一个 是 false (就像你的......现在),它确实不调用未定义的行为。无论哪种方式,这都会给编码人员带来巨大的负担,因为故意编写一些当时看似“安全”的东西是非常容易的,只是后来发现有人添加了使用传递一个const对象;编译器没有机会捕捉到它。
标签: c++ compiler-errors const-correctness