5
struct A 
{ 
    enum InnerEnum { X }; 

    A(InnerEnum x) 
    {} 
}; 

int main() 
{ 
    A a(X); 
} 

コンパイラは文句:error C2065: 'X' : undeclared identifierなぜC++ 11はこのような名前検索をサポートしていませんか?

コンパイラは、コンストラクタのパラメータの型が何であるかを知っている、私は引数としてXを渡すときに、コンパイラは、それが有効な引数である知っている必要があります。

私はこれがADL(Argument-Dependent Name Lookup、Koenig Lookupとも呼ばれます)ではないことを知っていますが、これは便利で、かなり便利だと思います。

A a(A::X); 

私はこのような場合にADLルールを一般化するべきだと考えます。

私は正しいですか?

+2

これはADL ... FDL(関数依存ルックアップ)の逆です。 –

+9

あなたは 'X'という名前のローカル変数も持っているとき、これがどのように適用されるのか考えましたか?そして、あなたの質問を読んでいても、これは無効なC++だと言っていて、C++標準を変更するかどうかを尋ねています。これは間違った場所です。 – hvd

+0

ありがとう、hvd。あなたは私たちに説得力のある理論的根拠を与えました。 – xmllmx

答えて

10

C++での関数呼び出しは、関数のオーバーロード解決の対象です。オーバーロードの解決は、引数の型によって行われます。私。言語は具体的にその方向で "作用する":引数の型から特定の名前の関数の特定のバージョン。

関数名に基づいて逆プロセス - 引数型減算を導入することを提案しています。これは一般的な場合には機能しません。 (あなたの例のように)候補関数が1つしかない場合でも機能するかもしれませんが、関数がオーバーロードされている一般的な状況で動作する原則に反します。

もちろん、非修飾名Xの名前検索でA::Xに加えてXという名前の名前が見つかると、さらに複雑になります。私はそれが簡単に直感に反することができると思います。

+0

私は一般的に適用される複雑さの議論を理解しています。だから、一般的ではないかもしれませんが、何らかの理由でこれが 'enums 'に特に有用であると思います。それらはしばしば関数の任意の名前付きオプションとして機能するためです。 – alfC

4

このような場合には、ADLルールを一般化する必要があります。

ありがとうございます。

C++には、(厄介な)驚きのシェアがあります(他の言語には、explicitが必要です)。私の予期しない言語規則のリストに追加すると、十分なメリットが表示されません。予期しない状況でのコード。

2つのコロンのあとに2つのコロンが続くような追加のタイプ入力が見つかった場合は、確かにC++構文の一般的なバロックの性質が今のところ取り除かれているはずですか?

関連する問題