2016-10-27 15 views
0

私はADLをトリガーするデフォルトの引数を期待して次のコードを書いています。それは(私は代わりにコンパイラのエラーを持っていません)。
ADLをトリガするために明示的な引数が必要ですか?引数依存ルックアップがデフォルト引数で機能しないのはなぜですか?

#include <iostream> 

namespace sheldon 
{ 
    enum FLAG{ USA , UK , EU }; 

    void fun(FLAG f = USA) 
    { 
     std::cout << "Fun with flags!" << std::endl; 
    } 
} 

int main() 
{ 
    fun(); // Does not compile 
    // fun(sheldon::USA); // compiles 
} 
+5

まあ...引数なしでADLをトリガすることはできません。明確にするために、「引数」は、関数が呼び出されたときに渡される実際の値/参照を参照し、関数がその宣言で指定する名前/型である「パラメータ」を参照します。 – nephtes

+0

@JohnKugelman親切にありがとう、やってます。引数依存ルックアップのADL標準 – nephtes

+0

それは名前のすべてです... – Barry

答えて

2

ADLは唯一の名前空間は、その内容を単離するのに無用になるだろう、そうでないものは本当に恐ろしいだろう、あなたはそれを与える引数で動作します。
はあなたにもこれがあれば何が起こるかを考える:

namespace fun { 
    struct tag {}; 
    void fun(tag = {}) 
    { 
     std::cout << "Fun with tags!" << std::endl; 
    } 
} 

我々はフラグまたはタグと楽しみましょうか

+0

Whoa 'fun :: fun()'は実際に遵守します! ...あなたは 'namespace fun'の代わりに' namespace sheldon'を書いていましたか? – Olumide

+0

いいえ.ADLがデフォルトの引数でも動作する場合、クロススペース・スペースの競合に溺れていることを示す必要があります。 – Deduplicator

+0

ああ...そうだ。 ADLが私が想定していたやり方で働いていたら。コンパイラは任意のネームスペースで 'fun()'を自由に選ぶことができます。 – Olumide

3

コンパイラが関数呼び出し式を検出すると、コンパイラは呼び出し可能な関数のオーバーロードセットを作成し、オーバーロード解決を実行します。 ADLは過負荷セット生成の一部です。この文に来るとき
は今、:

fun(); 

まず、それが可能な過負荷のためのグローバル名前空間に見えます。そしてそれは誰も見つけません。
その後、に渡された引数に基づいてADLを実行しますが、引数は渡しませんでした。
したがって、オーバーロードセットは空です。

2

次の関数の呼び出し:

fun(); 

は引数が含まれていないので、それは引数依存ルックアップを引き起こす可能性が方法はありません。

明確にするために、「引数」は、関数が呼び出されたときに渡される実際の値/参照を参照します。「パラメータ」は、関数が宣言で指定する名前/型です。

+0

あなたは非常に興味深い点を作っています。しかし、「デフォルト値」(それをそれと呼ぶ)は名前でもタイプでもありません。私はあなたを文字通りに連れて行きます。 – Olumide

+0

@Olumide:正しいですが、私は実際には "パラメータ"の定義に包含されるデフォルト値を考慮しません。この例の場合、タイプは 'FLAG'、名前は' f'です。デフォルト値は、パラメータを補完するものの一部ではありません。私は主にメモリから行っていますが、私は自分の用語が一致するように言語仕様をチェックしなければなりません。 – nephtes

+0

「あなたは本当に考えていないのですか? ...(私は意地悪ではありませんが)確かにそのようなことは個人の意見に任されていません。 – Olumide

関連する問題