ホームページ >バックエンド開発 >C++ >C ではコンストラクターのテンプレート パラメーターの推論が許可されないのはなぜですか?

C ではコンストラクターのテンプレート パラメーターの推論が許可されないのはなぜですか?

DDD
DDDオリジナル
2024-12-07 01:46:12879ブラウズ

Why Doesn't C   Allow Template Parameter Inference for Constructors?

コンストラクターからのテンプレート パラメーターの推論

C 言語では、関数パラメーターからテンプレート パラメーターを推論できますが、クラス コンストラクターからは推論できません。これにより、次のような疑問が生じる可能性があります。なぜコンストラクタに対してこの推論を許可しないのですか?

コンストラクタに対してテンプレート推論が許可されない理由の 1 つは、コンストラクタがクラスの唯一のエントリ ポイントではないためです。コピー コンストラクターと代入演算子は、クラスのオブジェクトを作成する追加の方法を提供します。コンストラクターのテンプレート推論を許可すると、コンパイラはテンプレート パラメーターを決定するときにこれらのエントリ ポイントをすべて考慮する必要があり、構文の曖昧さが生じる可能性があります。

class MyClass {
    int a;
    int b;

public:
    MyClass(int a, int b): a(a), b(b) {}
};

この例では、コンストラクターにテンプレート推論が許可されている場合、コピー コンストラクターまたは代入演算子を使用して MyClass オブジェクトを作成するときに、どのテンプレート パラメーターを使用する必要があるかが不明瞭になります。

テンプレート推論が行われるもう 1 つの理由は次のとおりです。コンストラクターでは許可されないのは、予期しない動作を引き起こす可能性があるためです。次のコードを考えてみましょう。

class MyContainer {
    std::vector<T> vec;
};

int main() {
    MyContainer<int> container; // explicitly specify template parameter
    MyContainer container2(vec); // infer template parameter from constructor
}

この例では、MyContainer クラスは、明示的に指定されたテンプレート パラメーターまたは特定の型のベクトルのいずれかを使用して構築できます。コンストラクターにテンプレート推論が許可されている場合、コードの 2 行目で T 型の MyContainer が作成されます。ただし、ユーザーは int 型の MyContainer を作成したいと考えている可能性があるため、これは意図した動作ではない可能性があります。

これらの懸念により、クラス コンストラクターではテンプレート推論が許可されません。ただし、C 17 では、部分的なテンプレートの特殊化を使用して、同様の効果を実現できます。部分的なテンプレートの特殊化により、ユーザーは他のテンプレート パラメーターを推論したままにして、特定の型のテンプレート パラメーターを指定できます。

template <typename T>
class MyContainer {
    std::vector<T> vec;
};

template <>
class MyContainer<int> {
    std::vector<int> vec;
};

int main() {
    MyContainer container; // infer template parameter to 'int'
    MyContainer<double> container2; // explicitly specify template parameter
}

この例では、MyContainer クラスに int の部分的なテンプレートの特殊化があります。これは、MyContainer が int 型で作成されると、テンプレート パラメーターが自動的に int であると推論されることを意味します。他の型の場合、テンプレート パラメーターを明示的に指定する必要があります。

以上がC ではコンストラクターのテンプレート パラメーターの推論が許可されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。