Cal*_*itt 18 c++ compiler-construction const
例如,假设我有一个类:
class Foo
{
public:
    std::string& Name()
    {
        m_maybe_modified = true;
        return m_name;
    }
    const std::string& Name() const
    {
        return m_name;
    }
protected:
    std::string m_name;
    bool m_maybe_modified;
};
在代码中的其他地方,我有这样的事情:
Foo *a;
// Do stuff...
std::string name = a->Name(); // <-- chooses the non-const version
有谁知道为什么编译器在这种情况下会选择非const版本?
这是一个有点人为的例子,但我们试图解决的实际问题是如果对象已经改变则定期自动保存,并且指针必须是非const的,因为它可能在某些时候被更改.
Lev*_*Lev 18
因为a不是const指针.因此,非const函数是更接近的匹配.以下是调用const函数的方法:
const Foo* b = a;
std::string name = b->Name();
如果你同时拥有const和非const重载,并且想要在非const对象上调用const,那么这可能表明设计不好.
编译器不会考虑如何在其确定中使用返回值; 这不是规则的一部分.它不知道你是否正在做
std::string name = b->Name();
要么
b->Name() = "me";
它必须选择适用于这两种情况的版本.