在const方法中使用引用

Max*_*xpm 2 c++ methods const class const-correctness

假设我有这样一个类:

class LinkedList
{
    struct Node
    {
        int StoredValue;
        // ...
    };

    Node& GetNodeReference(std::size_t Index)
    {
        // ...

        return NodeReference;
    }

    public:

    int Get(std::size_t Index) const
    {
        return GetNodeReference(Index).StoredValue;
    }
};
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为该const方法Get使用GetNodeReference,这不能是const因为它返回一个引用.

我该如何解决这个问题?

fre*_*low 8

我不确定你想要实现什么,但你可以提供两个重载GetNodeReference:

Node& GetNodeReference(std::size_t Index)
{
    // ...

    return NodeReference;
}

const Node& GetNodeReference(std::size_t Index) const
{
    // ...

    return NodeReference;
}
Run Code Online (Sandbox Code Playgroud)

请注意,第二个重载有两个const修改器,一个在返回类型的行的开头,另一个在隐式传递的*this对象的行的末尾.

为避免代码重复,您可以基于const重载实现非const重载:

const Node& GetNodeReference(std::size_t Index) const
{
    // ...

    return NodeReference;
}

Node& GetNodeReference(std::size_t Index)
{
    return const_cast<Node&>(static_cast<const LinkedList&>(*this).getNodeReference(Index));
}
Run Code Online (Sandbox Code Playgroud)

Scott Meyers 在Effective C++的第3项中讨论了这种技术.