2017-12-18 54 views
9

我最近有代码的问题是这样的:为什么编译器不能推导自动模板参数,除非我添加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

回答

8

这是海湾合作委员会的错误,它不推断l在这两种情况下?

这是一个bug,对于Clang也是。对于一个占位符类型的非类型参数,[temp.arg.nontype]/1说:

如果模板参数的类型包含的占位符类型,的 推断参数类型由占位符的类型 模板参数的确定类型扣除。如果模板参数声明 ([temp.param])不允许推导出 参数类型,则该程序不合格。

非常相同的过程,其中,将在这里演绎

int main() { 
    auto& l = lambda; 
} 

l是const引用。

相关问题