26

標準では、次のようなコードは許可されていません。

namespace Hello::World {

//Things that are in namespace Hello::World

}

代わりに

namespace Hello { namespace World {

//Things that are in namespace Hello::World

}}

根拠は何ですか?これは単にその時点では考えられていなかったのでしょうか、それとも含まれていない特別な理由があるのでしょうか?

最初の構文は、宣言が後のコードでの名前空間の実際の使用を模倣しているため、名前空間がどの名前空間にあると想定されているかをより直接的に表現しているようです。また、不幸にも「ばかげた」ブラケット カウント インデント ツールを使用している場合、インデントが少なくなります。

4

5 に答える 5

23

その理由は、「言語がそのように進化したため」である可能性が最も高いです。

ネストされた名前空間定義を許可する少なくとも 1 つの提案 ( 2003 年の「ネストされた名前空間定義提案」 ) がありましたが、C++0x に含めるために選択されませんでした。

于 2010-08-30T19:25:43.013 に答える
16

ネストされた名前空間の定義は、C++17 ワーキング ドラフトの一部です。このトピックは、この機能がプログラマーの要求する元のn4026 更新バージョン: n4230
である例として、提案で言及されています。

現在の最新のドラフト: n4567 (7.3.1 項 10 項)

7.3.1 名前空間定義
...
10 囲み名前空間指定子 E、識別子 I、および名前空間本体 B を持つネストされた名前空間定義は、namespace E { namespace I { B } }

namespace A::B::C {
  int i;
}    The above has the same effect as:

namespace A {
  namespace B {
    namespace C {
      int i;
    }
  }
}

コンパイラのサポート

バージョン 6以降の GCC -std=c++1z
Visual C++の使用が有効2015 update 3/std:c++latest
以降 Clang の使用が有効バージョン 3.6以降の使用が有効-std=c++1z

于 2016-09-25T18:40:23.640 に答える
13

与えられたnamespace X::Y場合、「名前空間X {名前空間Y`。これは表面上は問題ないように聞こえますが、コーナーケースを考慮してください。

namespace Hello {
   namespace {
      namespace World {}
   }
}

// Does this refer to an existing namespace? Or does it define a new one?
namespace Hello::World {}
于 2010-08-30T19:35:08.337 に答える
2

その「重複の可能性」スレッドで述べたように、C++ では修飾名は以前に宣言されたエンティティを参照するために予約されています。これは、クラスと名前空間の修飾名の両方の「ソース」に適用されます。

于 2010-08-30T19:28:26.077 に答える
0

設計上の選択だったと思います。

最初の構文は良さそうです。私も持ってみたいです。ただし、2 つ目はより構造化されています。この方法では、ネストされた名前空間を作成しません。

Hello::World::Everyone::Great {

}

これを事前に宣言しますか?

于 2010-08-30T19:52:22.117 に答える