1. ホーム
  2. c++

[解決済み] コンストラクタからテンプレートパラメータを推論しないのはなぜですか?

2022-09-18 14:09:58

質問

今日の私の質問はとてもシンプルです。なぜコンパイラは、関数パラメータからできるように、クラスコンストラクタからテンプレートパラメータを推論できないのでしょうか?たとえば、なぜ次のようなコードは有効でないのでしょうか。

template <typename obj>
class Variable {
    obj data;
public:
    Variable(obj d) { data = d; }
};

int main() {
    int num = 2;
    Variable var(num); // would be equivalent to Variable<int> var(num),
    return 0;          // but actually a compile error
}

と言うように、これが有効でないことは理解しているので、私の疑問は なぜ は有効ではないのでしょうか?これを許可すると、何か大きな構文上の穴ができるのでしょうか?この機能を必要としない例(型の推測が問題を引き起こすような場合)はありますか?私は、関数のテンプレート推論を許可し、適切に構築されたクラスのテンプレート推論を許可しない論理を理解しようとしているだけです。

どのように解決するのですか?

コンストラクタがクラスの唯一のエントリポイントであるとは限らないため、有効ではないと思います(コピーコンストラクタと operator= について話しています)。 例えば、次のようにクラスを使用するとします。

MyClass m(string s);
MyClass *pm;
*pm = m;

MyClass pm がどのようなテンプレートタイプであるかは、パーサーにとってそれほど明白なことではないのでしょう。

私が言ったことが意味をなすかどうかわからないが、何かコメントを追加してください。

C++ 17

C++17 では、コンストラクタの引数から型控除が行われることが認められています。

例を挙げます。

std::pair p(2, 4.5);
std::tuple t(4, 3, 2.5);

受理された論文 .