在下面的代码中,在第一个表单上,gcc抱怨在模板参数中有一个lambda。在第二种形式中,gcc抱怨lambda_function_pointer没有外部链接。即使用-pedantic,Clang编译并运行代码就好了。
lambda前面的+
是强制它衰变为函数指针。
template<auto f>
void func() {
f();
}
void g();
int main() {
func<+[](){}>(); // gcc complains about lambda in template args
constexpr auto lambda_function_pointer = +[](){};
func<lambda_function_pointer>(); // gcc complains about not having external linkage
}
直播:https://godbolt.org/g/ey5uo7
谢谢。
编辑:https://timsong-cpp.github.io/cppwp/n4659/expr.prim.lambda#2
为了使lambda不在签名中,提到lambdas没有出现在模板参数中,但是使用+
,它摆脱了lambda类型。
edit2:这可能与问题的链接部分有关:Why did C++03 require template parameters to have external linkage?
答案 0 :(得分:3)
func<+[](){}>
在C ++ 17中格式不正确。非规范性说明只是解释了规范性禁止的动机。它没有 - 也不能 - 限制它。 P0315在当前工作草案中已删除此限制,因此很有可能使C ++ 20。
Pre-C ++ 17, lambda-expression 无法在常量表达式中求值。
&#34;链接&#34;部分是Can I use the result of a C++17 captureless lambda constexpr conversion operator as a function pointer template non-type argument?的副本。这是GCC的错误。