当用作模板参数时,函数指针是否需要指向具有外部链接的函数?

时间:2018-02-19 00:27:15

标签: c++ templates lambda

在下面的代码中,在第一个表单上,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?

1 个答案:

答案 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的错误。