【发布时间】:2015-10-23 18:34:05
【问题描述】:
最近我检查了大量遗留的 C++ 代码,发现了一些我以前在生产 C++ 代码中从未见过的东西:
class Foo
{
public:
void Bar()
{
std::cout << "Hello from Bar()!" << std::endl;
}
void Bar() const
{
const_cast<Foo*>(this)->Bar();
}
};
这是一个巨大的反模式吗?我的意思是,函数要么是 const 要么是非常量,提供两个版本有什么意义?这是某种“const-correctness cheat”,允许调用 const 函数是这样的情况:
void InvokeBar(const Foo& foo)
{
// oh boy! I really need to invoke a non-const function on a const reference!
foo.Bar();
}
【问题讨论】:
-
const_cast是 const-correctness欺骗。它告诉编译器让你做一些它不能证明是正确的事情。 -
有两个具有相同名称的成员函数,一个 const 另一个不具有 个合法用途,例如
begin和end迭代器函数,它们在非 const 对象上返回非 const 迭代器,在 const 对象上返回 const 迭代器,但如果它是从 const 强制转换来做某事,它闻起来像鱼。 -
经典例子是
operator [ ]en.cppreference.com/w/cpp/container/vector/operator_at的重载
标签: c++ constants anti-patterns