我有下面的代码,但是它无法正常运行:
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' vs 'foo &')
是否有可能推断出左值引用模板参数?如果可能,应该如何实现?
foo1
作为表达式的(可观察)类型是foo
,因此与模板参数F
的类型foo&
不完全匹配。这可能是标准中的缺陷。 - dypf
的类型报告为FooClass<foo1>
。这代表了根据此处规定编写的独立版本的__cxa_demangle
:http://mentorembedded.github.io/cxx-abi/abi.html#mangling - Howard Hinnantf
的类型是class FooClass<&struct foo foo1>
。并且,它成功地编译了这个示例。 - Howard Hinnant&
”。这有点繁琐,但它试图说明您可以使用任何具有静态存储期的对象的名称(因为将&
应用于这样的对象将产生常量表达式)。 - M.M