为什么编译器不能推断出自动模板参数,除非我添加 const?
Why can't the compiler deduce auto template parameter unless I add const?
我最近遇到这样的代码问题:
constexpr auto lambda = []{};
template<auto& l>
struct Lambda {};
template<auto& l>
void test(Lambda<l>) {}
int main() {
test(Lambda<lambda>{});
}
clang 和 GCC 都告诉它无法推断 l
。
但是,如果我在那里添加 const:
// ----v
template<const auto& l>
void test(Lambda<l>) {}
然后一切都与 clang 一起工作。海湾合作委员会仍然失败。这里发生了什么事?它不能推导出 const
本身吗?这是一个 GCC 错误,因为它在这两种情况下都没有推导 l
吗?
Is this a GCC bug for it to not deducing l in both cases?
这是一个错误,对于 Clang 也是如此。对于占位符类型非类型参数,[temp.arg.nontype]/1 表示:
If the type of a template-parameter contains a placeholder type, the
deduced parameter type is determined from the type of the
template-argument by placeholder type deduction. If a deduced
parameter type is not permitted for a template-parameter declaration
([temp.param]), the program is ill-formed.
与此处推导的过程完全相同
int main() {
auto& l = lambda;
}
l
是常量引用。
我最近遇到这样的代码问题:
constexpr auto lambda = []{};
template<auto& l>
struct Lambda {};
template<auto& l>
void test(Lambda<l>) {}
int main() {
test(Lambda<lambda>{});
}
clang 和 GCC 都告诉它无法推断 l
。
但是,如果我在那里添加 const:
// ----v
template<const auto& l>
void test(Lambda<l>) {}
然后一切都与 clang 一起工作。海湾合作委员会仍然失败。这里发生了什么事?它不能推导出 const
本身吗?这是一个 GCC 错误,因为它在这两种情况下都没有推导 l
吗?
Is this a GCC bug for it to not deducing l in both cases?
这是一个错误,对于 Clang 也是如此。对于占位符类型非类型参数,[temp.arg.nontype]/1 表示:
If the type of a template-parameter contains a placeholder type, the deduced parameter type is determined from the type of the template-argument by placeholder type deduction. If a deduced parameter type is not permitted for a template-parameter declaration ([temp.param]), the program is ill-formed.
与此处推导的过程完全相同
int main() {
auto& l = lambda;
}
l
是常量引用。