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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

Q&A

解決済

1回答

1728閲覧

エイリアステンプレートをかませた場合の型推論

hoge111

総合スコア17

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

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

0グッド

0クリップ

投稿2021/04/09 00:25

????いつもありがとうございます

前回(関連する)の質問

https://teratail.com/questions/331361#reply-457823

url先で、次のコードは「エラーがでてコンパイルが通らない」と言っていたのですが、実行してみるとコンパイルが通り期待通りの動作をしてくれました

画面でエラーが出ていただけでした(IntelliSenseの問題)

cpp

1//concept 2template<typename T> 3concept Integer = std::integral<T>; 4 5 6template<Integer T> 7struct Int { 8 9 //コンストラクタ 10 Int(T i) :i(i) {} 11 12 T i;//メンバ変数 13}; 14 15template<Integer T> 16using Int2 = Int<T>; 17 18 19int main() { 20 Int i(0); 21 22 /*ここ*/ 23 Int2 i2(0);//error  24}

????そこで関連して質問があるのですが、上のコードがコンパイルOKで↓のコードがNGな理由がわかりません

質問: alias templateとやらを間にかませたときに、型推論できる場合とできない場合の分別方法が知りたいです

cpp

1#include <vector> 2 3template<typename T> 4using v = std::vector<T>; 5 6 7int main() { 8 std::vector<int> a = { 1 };//ok 9 std::vector a2 = { 1 };//ok 10 11 v<int> a3 = { 1 };//ok 12 v a4 = {1};//error 13 14 std::vector a5(1, 1);//ok 15 v a6(1, 1);//error 16}

環境

????visual studio2019 version16.9
????C++20(VC++ latest)
????windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++標準ライブラリstd::vector<T, Allocator>のアロケータ(Allocator)サポートが、エイリアステンプレート経由でのテンプレート引数推論失敗の原因と思われます。

std::vector<T>は厳密には型std::vector<T, std::allocator<T>>となります。クラステンプレート引数推論ではコンストラクタのシグネチャを利用しますが、推論過程ではコンストラクタへのデフォルト引数(const Allocator& = Allocator())が無視されるためにこのような挙動になったと考えられます。

C++20 std::vector<T, Allocator>コンストラクタは下記オーバーロードを提供します。

cpp

1constexpr vector() noexcept(noexcept(Allocator())); 2constexpr explicit vector(const Allocator&) noexcept; 3constexpr explicit vector(size_type n, const Allocator& = Allocator()); 4constexpr vector(size_type n, const T& value, const Allocator& = Allocator()); 5template<class InputIterator> 6 constexpr vector(InputIterator first, InputIterator last, const Allocator& = Allocator()); 7constexpr vector(const vector& x); 8constexpr vector(vector&&) noexcept; 9constexpr vector(const vector&, const Allocator&); 10constexpr vector(vector&&, const Allocator&); 11constexpr vector(initializer_list<T>, const Allocator& = Allocator());

C++コンパイラはクラス構築時の実引数リスト{1}つまり「1個のint型」からTの推論を試みます。引数を1個だけとるコンストラクタは下記3個しかありませんが、いずれもint型との互換性はなく推定に失敗します。

cpp

1constexpr explicit vector(const Allocator&) noexcept; 2constexpr vector(const vector& x); 3constexpr vector(vector&&) noexcept;

投稿2021/04/09 05:48

yohhoy

総合スコア6191

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

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

hoge111

2021/04/12 04:20

ありがとうございます ゆっくり読ませていただきます????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問