5
struct A
{
    enum InnerEnum { X };

    A(InnerEnum x)
    {}
};

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

コンパイラは不平を言います:error C2065: 'X' : undeclared identifier

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

これが ADL (Argument-dependent Name Lookup、Koenig Lookup とも呼ばれる) ではないことはわかっていますが、便利でかなり便利だと思います。次のように書く必要がないからです。

A a(A::X);

ADL ルールはそのような場合に一般化されるべきだと思います。

私は正しいですか?

4

2 に答える 2

10

C++ での関数呼び出しは、関数オーバーロードの解決の対象となります。オーバーロードの解決は、引数の型によって決まります。つまり、言語は特にその方向に「機能」します。引数の型から、指定された名前の関数の特定のバージョンまでです。

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

もちろん、修飾されていない名前の名前検索でXXあなたのA::X. 直観に反しやすいと思います。

于 2013-01-04T19:46:13.063 に答える
4

ADL ルールはそのような場合に一般化されるべきだと思います。

いいえ、結構です。

C ++には(厄介な)驚きがあります(他のどの言語がキーワードとして必要かを知っていますexplicitか?)、予期しない状況でコードを妨げる予期しない言語ルールのこのリストに追加するのに十分なメリットがあなたの例にはありません。

class-name に付随する 2 つのコロンに続く追加の入力が手間がかかりすぎることに気付いた場合は、C++ 構文の一般的なバロック式の性質に気が進まないはずです。

于 2013-01-04T19:47:00.963 に答える