1

ライブラリ内の完全修飾名が必要かどうかを知りたいです。

例 (ここでは、読みやすくするために名前空間をインデントしています):

namespace A {
    namespace B {
        namespace C {
            class Foo { ... };
        } // namespace C

        ::A::B::C::Foo foo;
        // or
        C::Foo foo
    } // namespace B
    namespace D {
        ::A::B::C::Foo foo;
        // or
        B::C::Foo foo
    } // namespace D
} // namespace A

C++ 標準の 3.4 の章を完全には理解していませんでした。また、STL ベクトル ヘッダーで説明できないものを見ました (読みやすいように簡略化しています)。

namespace std {
    template<..
    class reverse_iterator
    { ... };

    template<..
    class vector {
        typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
        ...
    }
}

問題は、_STD が ::std:: に展開されることです。しかし、名前の検索に関する私の理解によれば、reverse_iterator は最初にベクトルで検索され、次に std である親名前空間で検索されます。どのように衝突が可能でしょうか?

副次的な質問: 引数を持つテンプレート関数の名前の名前検索規則は何ですか? 修飾された ID は、ADL なしで既に宣言されている名前を直接検索すると思いますが、修飾されていない名前は ADL を実行します。

ご回答ありがとうございます。

4

1 に答える 1

4

そうですよね、そこでは資格は不要のようです。

標準ライブラリ コードから C++ を学ぼうとしないでください。後方互換性、移植性、代替構成 (たとえば、歴史的なコンパイラのすべての名前空間を無効にするなど) など、おそらくあなたには当てはまらないさまざまな理由から、非常に独特なスタイルで書かなければなりません。 )。一部の構成で_STDは、別のものに拡張される可能性があります。または、冗長である可能性があります (ただし、無害です)。

引数を持つテンプレート関数の名前の名前検索ルールは何ですか? 修飾された ID は、ADL なしで既に宣言されている名前を直接検索すると思いますが、修飾されていない名前は ADL を実行します。

はい、ADL は非修飾名にのみ適用されます。

于 2013-08-08T08:15:57.367 に答える