これは、C++ 標準に従って、整形式または整形式ですか?
namespace M { struct i {}; }
namespace N { static int i = 1; }
using M::i;
using N::i;
int main() { sizeof (i); }
Clang はそれを拒否し、GCC はそれを受け入れます。
[namespace.udir-6] ( http://eel.is/c++draft/basic.namespace#namespace.udir-6 ) によると:
名前検索で 2 つの異なる名前空間で名前の宣言が検出され、宣言が同じエンティティを宣言せず、関数も宣言されていない場合、その名前の使用は不適切です。
これをどのように解釈すべきでしょうか。各 using 宣言は [namespace.udecl]p1 ( http://eel.is/c++draft/namespace.udecl#1 )によって名前を宣言していることに注意してください。
using 宣言は、using 宣言が現れる宣言領域に名前を導入します。
using-declaration :ネストされた名前指定子の非修飾 IDを
using typename
選択します;
using宣言で指定されたメンバー名は、using宣言が現れる宣言領域で宣言されます。[ 注: 指定された名前のみがそのように宣言されています。using-declaration で列挙名を指定しても、using-declaration の宣言領域でその列挙子が宣言されません。— 終わりの注 ] using 宣言がコンストラクター ([class.qual]) を指定する場合、using 宣言が現れるクラス ([class.inhctor]) 内のコンストラクターのセットを暗黙的に宣言します。それ以外の場合、using-declaration で指定された名前は、別の名前空間またはクラスの一連の宣言の同義語です。
したがって、名前 i の 4 つの宣言があります。
これらのうち、非修飾名検索で検索されるのはどれi
ですかsizeof(i)
?
プログラムが整形式であるように、同じ名前空間 (グローバル名前空間) にあるusing M::i;
とだけを見つけますか?using N::i;
それとも、異なる名前空間にある と だけを見つけstruct i {};
てstatic int i = 1;
、プログラムの形式が正しくないのでしょうか?
または、他の代替手段がありますか?