[解決済み] コンストラクタからテンプレートパラメータを推論しないのはなぜですか?
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);
受理された論文 .
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】std::make_pairとstd::pairのコンストラクタは何のためにあるのですか?