0

C++

これらのテンプレート関数のどれも

template<typename T> void foo(T par = nullptr) {return;}  //#1
template<typename T> void foo(T par = std::nullptr_t(nullptr)) {return;}  //#2
template<typename T> void foo(T par = int(0)) {return;}  //#3

次の引数なしの呼び出しで何でもコンパイルできるようにします。

foo();

fooただし、任意の値で呼び出します (例: foo(2))。

nullptrには特定の型があるstd::nullptr_tため、#1 でデフォルト パラメータに追加の型修飾が必要だとは思いませんでした。#2 と #3 ではデフォルト パラメータの型が明示的に指定されているため、型のあいまいさはないと思いました。

ここで何が問題なのですか?テンプレート関数でデフォルト パラメータを実行する適切な方法はありますか?

4

1 に答える 1

3

のテンプレート引数推定が失敗するため、例は機能しませんfoo()。C++11 では、関数テンプレートの既定のテンプレート引数を指定できるため、定義を次のように変更します。

template<typename T = void*> void foo(T par = nullptr) {return;}

C++03 では、テンプレート引数を明示的に指定する以外に方法がわかりません。

テンプレートの引数がデフォルトの引数から推定されない理由は、非推定コンテキストであると標準が述べているためです。

N3691 から、§14.8.2.5/5

非推定コンテキストは次のとおりです。

...

— 引数推定が行われている呼び出しで使用されている既定の引数を持つ関数パラメーターのパラメーター型で使用されるテンプレート パラメーター。

于 2013-10-02T01:47:28.717 に答える