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ではない場合でも、標準ではイテレータの名前がconst Tとして定義されています(インクリメントすることもできます)。const_iterator実際、イテレータの全体的な目的は、シーケンスを反復処理するために、イテレータを変更することです:)

typedef T const* const_iterator;

ポインターについては、個人的には、一般的に定数としてtypedefする理由はほとんどありません。したがって、Const後続部分の前は、イテレータと同じ意味を伝えることができ、既存の慣例に従います。だから私はあなたが行って言うのは完全に良いと思います

typedef boost::shared_ptr<Foo const> ConstRcPtr;

実際、これstd::allocator<>::const_pointerも言葉遣いです。

于 2010-05-17T18:10:03.307 に答える
4

constがどこに行くかについてのあなたの声明は正しいです:あなたは別のtypedefが必要です。このプロジェクトでは、Foo::TPtrFoo::TConstPtrを標準のtypedefとして使用します。

于 2010-05-17T18:10:38.347 に答える
1

typedefに名前を付けると、ConstRcPtrは、typedefが次のようになることを意味します。typedef const boost::shared_ptr<Foo> ConstRcPtr;

なぜそれを意味するのですか?人々が(非constポインターとは対照的に)「constポインター」について話すとき、彼らはほとんどの場合const char*、ではなく、を参照していchar *constます。はイテレータからconstであり、constであるイテレータではありません。また、との関係がとの関係と同じでconst_iteratorあることにまったく驚かないでしょう。ConstRcPtrRcPtrconst_iteratoriterator

const char*とを区別する必要がある場合はchar *const、はい、char *const「constポインタ」とconst char*「pointer-to-const」を呼び出すことができます。しかし、ほとんどそうしないので、一般的なケースでは「constpointer」という短いフレーズが使用されます。次の4つすべてを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 に答える