![](/img/trans.png)
[英]Binding a non-const lvalue reference to a deduced non-type template parameter
[英]Can an lvalue reference non-type template parameter be inferred?
我有以下代码,但我无法上班:
struct foo {};
foo foo1 = {};
template <foo& F>
class FooClass {};
template <foo& F>
void foobar(FooClass<F> arg) {
}
int main() {
FooClass<foo1> f;
foobar(f);
}
错误是:
main.cpp:14:5:错误:没有匹配的函数可以调用'foobar'
注意:候选模板被忽略:替换失败:推导的非类型模板参数与其相应模板参数的类型不同('foo'与'foo&')
是否可以推断左值参考模板参数? 如果是这样,应该怎么做?
CWG 2091恰好涵盖了这一点:
根据14.8.2.5 [temp.deduct.type]第17段,
如果
P
具有包含<i>
的形式,并且A
的对应值的类型与i
的类型不同,则推论失败。对于这样的示例,这给出了错误的结果:
template<int &> struct X; template<int &N> void f(X<N>&); int n; void g(X<n> &x) { f(x); }
在这里,
P
是X<N>
,其中包含<i>
。i
的类型为int&
。 来自A
的对应值是n
,它是int
类型的glvalue。 大概这应该是有效的。我认为这条规则意味着要说些类似的话,
如果
P
具有包含形式<i>
和类型i
从由包封简单模板id命名模板的对应模板的参数的类型而不同,扣失败。
如@dyp所述, [temp.deduct.type] / 17应该更宽松。 在您的示例中, FooClass<F>
( F
)中的参数没有引用类型-它是foo
类型的左值。 FooClass
的template参数是一个引用。 DR已于去年解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.