3
void S(){}
struct S{};

int main(){
   S();
}

上記のコードでは、main の式 'S()' は、タイプ 'S' のテンポラリを作成しようとするのではなく、関数呼び出し式として扱われます。

C++ 標準のどの部分で、関数宣言を優先するような式の解決について述べていますか? 何らかの理由で、私はそれを見つけることができません。

4

2 に答える 2

5

セクション 3.3.7/2

クラス名 (9.1) または列挙名 (7.2) は、同じスコープで宣言されたオブジェクト、関数、または列挙子の名前によって非表示にすることができます。 クラスまたは列挙名と、オブジェクト、関数、または列挙子が同じスコープで (任意の順序で) 同じ名前で宣言されている場合、クラスまたは列挙名は、オブジェクト、関数、または列挙子の名前が表示されている場所では非表示になります

次に、そのような場合に精巧な型指定子を使用する必要があります

3.4.4/1 詳細な型指定子

名前が非型宣言 (3.3.7) によって隠されていても、事前に宣言されたクラス名または列挙名を参照するために、詳細な型指定子を使用できます。 詳細型指定子のクラス名または列挙名は、単純な識別子または修飾 ID のいずれかです。

于 2010-11-04T05:14:05.827 に答える