繁体   English   中英

可以推断左值引用非类型模板参数吗?

[英]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); } 

在这里, PX<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM