给定以下模板结构:
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>>