考虑一个例子:
template <void (*Foo)()>
struct S {
};
int main() {
struct A {
static void x() { }
};
S<&A::x> s;
}
代码在clang编译,gcc认为x
没有联系......
对于使用lambda表达式的非常相似的例子:
template <void (*Foo)()>
struct S {
};
int main() {
auto lambda = []{};
S<+lambda> s;
}
gcc和clang都同意不编译代码:根据gcc,由unary +返回的函数没有链接,相反的是clang状态,将操作符转换为函数并不被声明为constexpr。是否有任何理由不允许lambda强制转换为在constexpr上下文中使用的函数指针?
查找以下编译器和现场演示产生的错误:
gcc:
prog.cc:7:14:错误:&#39; main():::: _ FUN&#39;不是类型&#39; void(*)()&#39;的有效模板参数。因为&#39;静态constexpr void main():::: _ FUN()&#39;没有联系
prog.cc:7:8:注意:非constexpr函数&#39; operator void(*)()&#39;不能用于常量表达式
答案 0 :(得分:10)
Clang hasn't implemented constexpr
lambdas yet。
请注意,_run-with-bundler:5: fork failed: resource temporarily unavailable
zsh: fork failed: resource temporarily unavailable
lambda和no-linkage函数指针模板参数都是C ++ 14后的特性。