为什么编译器不能推导自动模板参数,除非我添加const?
我最近有代码的问题是这样的:为什么编译器不能推导自动模板参数,除非我添加const?
constexpr auto lambda = []{}; template<auto& l>
struct Lambda {};
template<auto& l>
void test(Lambda<l>) {}
int main() {
test(Lambda<lambda>{});
}
两个铛和GCC告诉它不能推断l
。
不过,如果我添加常数有:
// ----v template<const auto& l>
void test(Lambda<l>) {}
然后一切正常铿锵。 GCC仍然失败。这里发生了什么事?它能否推导出const
本身?这是一个海湾合作委员会的错误,它不会在这两种情况下推断l
?
回答:
这是海湾合作委员会的错误,它不推断l在这两种情况下?
这是一个bug,对于Clang也是。对于一个占位符类型的非类型参数,[temp.arg.nontype]/1说:
如果模板参数的类型包含的占位符类型,的 推断参数类型由占位符的类型 模板参数的确定类型扣除。如果模板参数声明 ([temp.param])不允许推导出 参数类型,则该程序不合格。
非常相同的过程,其中,将在这里演绎
int main() { auto& l = lambda;
}
这l
是const引用。
以上是 为什么编译器不能推导自动模板参数,除非我添加const? 的全部内容, 来源链接: utcz.com/qa/261450.html