2

C ++ Primerから、テンプレートのパラメーター引数に対して、2種類の変換のみが実行されることがわかります。1つはconst変換であり、もう1つは配列/関数からポインターへの変換です。

しかし、明示的な議論になると、すべてが変わるようです。テンプレート関数があると仮定します。

template <typename T>
int compare(const T &a, const T &b)
{
    // do comparison
}

明示的な引数が含まれていない場合、次のような関数呼び出しは不正です。

compare("foo", "foobar");

私たちが明示的に行うと、奇妙なことが起こります(実際には、奇妙ではないかもしれませんが、私にはわかりません)。

compare<std::string>("foo", "foobar");

2回目の呼び出しでは、「foo」「foobar」がに変換されているようstd::stringですが、これについては議論の余地があります。

テンプレートの明示的な引数に特別なルールはありますか?ありがとう。

4

1 に答える 1

6

最初のケースでは、コンパイラは指定されたパラメータから型を推測しようとしTます。最初のパラメーターからコンパイラーはタイプconst char (&)[4](別名、4文字の配列への参照)を推測し、2番目のパラメーターからそれを取得しconst char (&)[7]ます。2つのタイプは一致せず、コンパイラーはどうあるTべきかを理解できません。

T2番目の例では、テンプレートパラメータ を明示的に指定しますstd::string。だからT になりますstd::string。コンパイラーは、指定されたタイプを受け入れ、指定された関数パラメーターがそのタイプと一致するかどうかをチェックします。この場合、パラメータは適合します。これは、"foo""foobar"が暗黙的にに変換される可能性があるためstd::stringです。(にconst char[]劣化し、からconst char*を構築できるコンストラクターがあります)std::stringconst char*

于 2012-09-25T00:30:09.247 に答える