質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
型推論

型推論とは、コンパイラが型を自動で判断する機能を指します。メソッド内のローカル変数の宣言時に型宣言の代わりに指定することで、コードの記述量を減らすことが可能。変数や関数シグネチャに型を宣言せずとも、早期にエラーをチェックできるというメリットもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2936閲覧

テンプレートとautoの違い

apa

総合スコア68

型推論

型推論とは、コンパイラが型を自動で判断する機能を指します。メソッド内のローカル変数の宣言時に型宣言の代わりに指定することで、コードの記述量を減らすことが可能。変数や関数シグネチャに型を宣言せずとも、早期にエラーをチェックできるというメリットもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/10/31 05:39

下記2つのソースコードについての質問となります。
templateのほうではコンパイルエラーが起きず、
autoではコンパイルエラーが起きます。
自分の認識的にはテンプレートともautoも大きな違いがないと思っておりますが、
なぜautoではコンパイルエラーが発生してしまうのでしょうか?
ここら辺に理解がある方おりましたらよろしくお願いいたします。

c++

1template<class T> 2class Delegate 3{ 4 std::function<T(int)> a; 5};

c++

1class Delegate 2{ 3 std::function<auto(int)> a; 4};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/10/31 06:40

後者はどうやって使うんですか? autoの部分をどうやって解決するんですか? templateではないのだから Delegete<int> とは書けませんが。
actorbug

2021/10/31 11:37

> 自分の認識的にはテンプレートともautoも大きな違いがないと思っておりますが、 どうしてそう思うのか説明すれば、回答者の方に意図が伝わりやすいのではないでしょうか。 「テンプレートはこれこれこういうもので、autoはこれこれこういうものです。 どちらもこれこれこういうものなので、大きな違いはないと思っています。」のような感じで。
guest

回答2

0

ベストアンサー

結論から申し上げれば単にできない規則になっているからです。

auto の役割は「自動で推論する」というところからスタートして後に「仮引数に auto があるとジェネリック化する」という機能が付け加えられたもので、そのあたりの役割を混同しているように思われます。

cpp

1template<class T> 2class foo { 3}; 4 5int main(void) { 6 // エラー 7 // auto のところに int があてはまることを推論する規則がないから推論できない 8 // 仮引数として auto が現れたわけではないからジェネリック化にもならない 9 foo<auto> bar = foo<int>(); 10}
int main(void) { // C++14 以降はラムダ式の仮引数に `auto` を指定するとジェネリック化できるようになった // C++17 以降では非型テンプレートのパラメータ、 C++20 では普通の関数の引数にも auto を使える auto foo = [](auto /* ← C++14以降ではここに auto が書ける*/ )->void{}; foo(1); foo("abc"); }

投稿2021/10/31 06:41

SaitoAtsushi

総合スコア5675

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apa

2021/10/31 09:30

返信ありがとうございます 単にテンプレートとautoでは、翻訳される順番が違うからという認識でしょうか?
SaitoAtsushi

2021/10/31 10:46

auto がテンプレートと同等の役割をはたす場合もありますが、今回ではそうではないにも関わらず似たようなものと捉えているのが誤りであると述べています。 順序がどうこうとかそういう問題ではなく違うものですので、どう違うとか説明するレベルのことではないんです。 関係ないんです。
ttact

2021/10/31 23:50 編集

全然違う2つの機能に、同じキーワードを割り当てているんですよ。 なんでそんなわかりづらいことをやっているかというと、新しいキーワードを導入してしまうと、その分プログラマが使える単語が減ってしまうからです。 C++みたいに歴史が長い言語だと、新しいキーワードを導入することで、既存のプログラムをビルドできなくなってしまうことがあるので、そういうキーワード追加は非常に慎重にやるのです。 まだ歴史が浅い言語や利用者が少ない言語はいいんでしょうが、C++の最大のメリットは既存資産に対する後方互換性なので、そういう観点からも言語を進化させるために出来ることが限られているのです。
apa

2021/11/06 09:57

なるほどです 別々のもので似ている機能が備わっていることは 理解することができました
guest

0

自分の認識的にはテンプレートともautoも大きな違いがないと思っておりますが、

なぜautoではコンパイルエラーが発生してしまうのでしょうか?

「テンプレートともautoも大きな違いがないと思っております」がマチガイだからでは?

投稿2021/10/31 10:59

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問