愚蠢的问题,但是说你有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名称:)
有没有人有任何其他建议?
答案 0 :(得分:4)
typedef的名称不代表用于定义其类型的语法结构。 typedef名称应该传达它的一些期望的含义。例如,标准将const T
上的迭代器名称定义为const_iterator
,即使迭代器本身不是const(您仍然可以增加它)。事实上,迭代器的整个目的是改变它,以便迭代序列:)
typedef T const* const_iterator;
对于指针,我个人认为通常将它们定义为常量没有什么理由。因此,尾随部分前面的Const
可以传达与迭代器相同的含义,并且将与现有实践一致。所以我觉得你说完
typedef boost::shared_ptr<Foo const> ConstRcPtr;
事实上,这也是std::allocator<>::const_pointer
的措辞。
答案 1 :(得分:4)
关于const的去向的陈述是正确的:你需要另一个typedef。在我们的项目中,我们使用 Foo :: TPtr 和 Foo :: TConstPtr 作为标准typedef。
答案 2 :(得分:1)
命名一个typedef ConstRcPtr对我来说意味着typedef将是typedef const boost::shared_ptr<Foo> ConstRcPtr;
为什么这意味着什么?当人们谈论“常量指针”(而不是非常量指针)时,他们几乎总是指const char*
,而不是char *const
。 const_iterator
是一个迭代器到const,而不是一个常量的迭代器,我不会感到惊讶ConstRcPtr
和RcPtr
之间的关系与它们之间的关系是一样的。 const_iterator
和iterator
。
如果您需要区分const char*
和char *const
,那么是的,您可以将char *const
称为“常量指针”,将const char*
称为“指针指向const” ”。但你几乎从不这样做,因此短语“const指针”用于常见情况。我认为这也适用于此,除非你打算输入以下四个:
boost::shared_ptr<Foo>
boost::shared_ptr<const Foo>
const boost::shared_ptr<Foo>
const boost::shared_ptr<const Foo>
在这种情况下,你必须对名字更有创意。