次のテンプレート構造があるとします。
template<typename T>
struct Foo {
Foo(T&&) {}
};
これはコンパイルT
され、次のように推定されますint
。
auto f = Foo(2);
しかし、これはコンパイルされません:https : //godbolt.org/z/hAA9TE
int x = 2;
auto f = Foo(x);
/*
<source>:12:15: error: no viable constructor or deduction guide for deduction of template arguments of 'Foo'
auto f = Foo(x);
^
<source>:7:5: note: candidate function [with T = int] not viable: no known conversion from 'int' to 'int &&' for 1st argument
Foo(T&&) {}
^
*/
ただし、Foo<int&>(x)
受け入れられます。
しかし、一見冗長なユーザー定義の控除ガイドを追加すると、機能します。
template<typename T>
Foo(T&&) -> Foo<T>;
ユーザー定義の控除ガイドがないT
と、なぜint&
控除できないのですか?
Foo<T<A>>