デフォルトのパラメータがパラメータパックと一緒に機能しないのはなぜですか?

Nanashi No Gombe

ための8.3.6([dcl.fct.default])/ 4

特定の関数宣言では、デフォルト引数を持つパラメーターに続く各パラメーターは、この宣言または前の宣言で指定されたデフォルト引数を持つか、関数パラメーターパックである必要があります。

以下をコンパイルする必要があります。

#include <iostream>

template<typename ...Ts>
void foo(int i=8, Ts... args)
{
    std::cout << "Default parameters \t= " << i << "\n";
    std::cout << "Additional params  \t= " << sizeof...(Ts) << "\n";
}

int main()
{
    foo();                  // calls foo<>(int)
    foo(1, "str1", "str2"); // calls foo<const char*, const char*>(int, const char*, const char*)
    foo("str3");            // ERROR: does not call foo<const char*>(int, const char*)

    return 0;
}

ただしfoo("str3")、コンパイラが混乱するため、コンパイルされません呼び出しに一致する関数foo(const char*)がなく、"str3"(type const char*)をtypeに変換できないと文句を言いintます。

関数のオーバーロードに頼るか、名前付きパラメーターのイディオムを使用することで、この問題を回避できることを理解しています(c ++の可変長関数のデフォルト値パラメーターの配置場所デフォルトの引数と可変個引数関数を参照)。ただし、コンパイラが愚かであるのか、それとも上記のコード例で意図した動作が実装されていない本当の理由があるのか​​を知りたいと思います。つまり、関数を明示的にインスタンス化しても、コンパイラが文句を言うのはなぜfoo<const char*>(int, const char*)ですか?これは、明示的なインスタンス化がデフォルトパラメータの値を単に無視するかのようです。どうして?

NathanOliver

あなたが引用している基準は、形成することが合法であると言っているだけです

template<typename ...Ts>
void foo(int i=8, Ts... args)

ただし、これを呼び出すときはint、最初のパラメーターとしてを渡す必要があります。そうしないと、過負荷の解決中に関数が考慮されません。あなたがするとき

foo("str3");

コンパイラーはfooconst char*またはをとる関数を探しconst char(&)[5]ます。これが唯一のパラメーターだからです。つまり、関数はint最初のパラメーターを予期しているか、パラメーターがまったくないため、完全に無視されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートパラメータパックが機能しないのはなぜですか?

分類Dev

パラメータ化されたコンストラクタが追加されたときにデフォルトのコンストラクタが機能しないのはなぜですか?

分類Dev

C ++派生クラスは、デフォルトのパラメーターがないと機能しません。

分類Dev

メソッドにパラメーターとして渡されたときにデリゲートが機能しないのはなぜですか?

分類Dev

パラメータパックエラーでclangにデフォルト引数がないのはなぜですか?

分類Dev

デフォルトのパラメーターと関数パラメーターの名前を同じにできないのはなぜですか?

分類Dev

オブジェクトのコピーを関数のパラメーターとして使用するのはなぜですか?const refがパラメータのデフォルトの方法ではないのはなぜですか?

分類Dev

別の構造体がメンバーとして共用体にラップされている構造体が、明示的なデフォルトコンストラクターなしでコンパイルされないのはなぜですか?

分類Dev

パラメータmultiがmongoリクエストで機能しないのはなぜですか?

分類Dev

constexprローカル変数がデフォルトの関数パラメーターとして許可されていないのはなぜですか?

分類Dev

デフォルトのプロパティ値がまだInit()のパラメータとして表示されているのはなぜですか?

分類Dev

フリーズタイムがデフォルトのパラメータで機能しない

分類Dev

デフォルトの引数の後にパラメータパックが許可されるのはなぜですか?

分類Dev

デフォルトのメソッドパラメータをC#のコンパイル時定数にする必要があるのはなぜですか

分類Dev

typescriptが必須パラメーターの前にデフォルトパラメーターを許可するのはなぜですか?

分類Dev

ProcessPoolExecutorで発生したときに、カスタム例外にデフォルトパラメータが必要なのはなぜですか?

分類Dev

パラメーター付きのコンストラクターを作成すると、デフォルトのパラメーターレスコンストラクターがなくなるのはなぜですか

分類Dev

killにファイルとポート番号のパラメータがないのはなぜですか?

分類Dev

C ++でパラメータをデフォルトの引数にすることができないのはなぜですか?

分類Dev

タスクマネージャに適用すると、「-n」や「-yn」などのパラメータが機能しないのはなぜですか

分類Dev

コンパイラが指定されたデフォルトのパラメータ値を認識しないのはなぜですか?

分類Dev

Xcodeが常にパラメータのデフォルト値のヒントを表示しないのはなぜですか?

分類Dev

PowerShell文字列のデフォルトのパラメーター値が期待どおりに機能しない

分類Dev

フォーマッターがフラグメントxmlで機能しないのはなぜですか?

分類Dev

パラメータがデフォルト値に設定されていても、letを使用して1つの関数パラメータと同じ名前を使用して変数を宣言できないのはなぜですか?

分類Dev

このGoogleApps Scriptのパラメータが期待どおりに機能しないのはなぜですか?

分類Dev

Enumパラメータがデフォルト値に戻るのはなぜですか?

分類Dev

デフォルトの関数パラメーターが期待どおりに機能しない

分類Dev

コンパイラがパッケージオブジェクトの型パラメータを推測できないのはなぜですか(オブジェクトに対しては正常に機能しますが)?

Related 関連記事

  1. 1

    テンプレートパラメータパックが機能しないのはなぜですか?

  2. 2

    パラメータ化されたコンストラクタが追加されたときにデフォルトのコンストラクタが機能しないのはなぜですか?

  3. 3

    C ++派生クラスは、デフォルトのパラメーターがないと機能しません。

  4. 4

    メソッドにパラメーターとして渡されたときにデリゲートが機能しないのはなぜですか?

  5. 5

    パラメータパックエラーでclangにデフォルト引数がないのはなぜですか?

  6. 6

    デフォルトのパラメーターと関数パラメーターの名前を同じにできないのはなぜですか?

  7. 7

    オブジェクトのコピーを関数のパラメーターとして使用するのはなぜですか?const refがパラメータのデフォルトの方法ではないのはなぜですか?

  8. 8

    別の構造体がメンバーとして共用体にラップされている構造体が、明示的なデフォルトコンストラクターなしでコンパイルされないのはなぜですか?

  9. 9

    パラメータmultiがmongoリクエストで機能しないのはなぜですか?

  10. 10

    constexprローカル変数がデフォルトの関数パラメーターとして許可されていないのはなぜですか?

  11. 11

    デフォルトのプロパティ値がまだInit()のパラメータとして表示されているのはなぜですか?

  12. 12

    フリーズタイムがデフォルトのパラメータで機能しない

  13. 13

    デフォルトの引数の後にパラメータパックが許可されるのはなぜですか?

  14. 14

    デフォルトのメソッドパラメータをC#のコンパイル時定数にする必要があるのはなぜですか

  15. 15

    typescriptが必須パラメーターの前にデフォルトパラメーターを許可するのはなぜですか?

  16. 16

    ProcessPoolExecutorで発生したときに、カスタム例外にデフォルトパラメータが必要なのはなぜですか?

  17. 17

    パラメーター付きのコンストラクターを作成すると、デフォルトのパラメーターレスコンストラクターがなくなるのはなぜですか

  18. 18

    killにファイルとポート番号のパラメータがないのはなぜですか?

  19. 19

    C ++でパラメータをデフォルトの引数にすることができないのはなぜですか?

  20. 20

    タスクマネージャに適用すると、「-n」や「-yn」などのパラメータが機能しないのはなぜですか

  21. 21

    コンパイラが指定されたデフォルトのパラメータ値を認識しないのはなぜですか?

  22. 22

    Xcodeが常にパラメータのデフォルト値のヒントを表示しないのはなぜですか?

  23. 23

    PowerShell文字列のデフォルトのパラメーター値が期待どおりに機能しない

  24. 24

    フォーマッターがフラグメントxmlで機能しないのはなぜですか?

  25. 25

    パラメータがデフォルト値に設定されていても、letを使用して1つの関数パラメータと同じ名前を使用して変数を宣言できないのはなぜですか?

  26. 26

    このGoogleApps Scriptのパラメータが期待どおりに機能しないのはなぜですか?

  27. 27

    Enumパラメータがデフォルト値に戻るのはなぜですか?

  28. 28

    デフォルトの関数パラメーターが期待どおりに機能しない

  29. 29

    コンパイラがパッケージオブジェクトの型パラメータを推測できないのはなぜですか(オブジェクトに対しては正常に機能しますが)?

ホットタグ

アーカイブ