3

愚蠢的问题,但说你有 Foo 类:

class Foo
{
public:
    typedef boost::shared_ptr<Foo> RcPtr;

    void non_const_method() {}
    void const_method() const {}
};

拥有 const Foo::RcPtr 不会阻止在类上调用非 const 方法,以下将编译:

#include <boost/shared_ptr.hpp>

int main()
{
    const Foo::RcPtr const_foo_ptr(new Foo);
    const_foo_ptr->non_const_method();
    const_foo_ptr->const_method();

    return 0;
}

但是命名一个 typedef ConstRcPtr 对我来说意味着 typedef 将是

typedef const boost::shared_ptr<Foo> ConstRcPtr;

这不是我感兴趣的。一个更奇怪但可能更准确的名字是 RcPtrConst:

typedef boost::shared_ptr<const Foo> RcPtrConst;

然而,谷歌搜索 RcPtrConst 的命中率为零,因此人们不会将其用作 typedef 名称 :)

有没有人有任何其他建议?

4

3 回答 3

4

typedef 的名称不代表用于定义其类型的语法结构。typedef 名称应该传达一些它想要的含义。例如,标准将迭代器的名称定义为const Tas const_iterator,即使迭代器本身不是 const (您仍然可以递增它)。事实上,迭代器的全部目的是改变它,以便迭代一个序列:)

typedef T const* const_iterator;

对于指针,我个人认为没有理由将它们一般地定义为常量。因此,Const尾部前面的部分可以传达与迭代器相同的含义,并将与现有实践相一致。所以我认为你去说完全没问题

typedef boost::shared_ptr<Foo const> ConstRcPtr;

事实上,这也是这样std::allocator<>::const_pointer的措辞。

于 2010-05-17T18:10:03.307 回答
4

您关于 const 去向的陈述是正确的:您需要另一个 typedef。在我们的项目中,我们使用Foo::TPtrFoo::TConstPtr作为标准类型定义。

于 2010-05-17T18:10:38.347 回答
1

命名 typedef ConstRcPtr 对我来说意味着 typedef 将是typedef const boost::shared_ptr<Foo> ConstRcPtr;

为什么会这样暗示?当人们谈论“const 指针”(与非 const 指针相反)时,他们几乎总是指的是const char*,而不是char *constconst_iterator是一个迭代器到常量,而不是一个常量迭代器,我一点也不奇怪and 之间的关系与 andConstRcPtr之间RcPtr的关系相同。const_iteratoriterator

如果您需要区分const char*and char *const,那么是的,您可以调用char *const“const 指针”和const char*“pointer-to-const”。但是您几乎从不这样做,因此短语“const pointer”用于常见情况。我认为这也适用于这里,除非您打算 typedef 所有四个:

boost::shared_ptr<Foo>
boost::shared_ptr<const Foo>
const boost::shared_ptr<Foo>
const boost::shared_ptr<const Foo>

在这种情况下,您必须在名称方面更有创意。

于 2010-05-17T18:21:11.533 回答