为什么编译器不能推导自动模板参数,除非我添加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

回到顶部