【发布时间】:2017-08-30 01:16:33
【问题描述】:
以下 sn-p compiles 在 Clang 4.0 中没有错误,但 GCC 7.0 生成 errors(注意使用 -std=c++1z 标志)。
using FuncT = int (*)(double);
template <FuncT FUNC>
int temp_foo(double a)
{
return FUNC(a);
}
int foo(double a)
{
return 42;
}
void func()
{
auto lambda = [](double a) { return 5; };
struct MyStruct
{
static int foo(double a) { return 42; }
};
temp_foo<foo>(3);
temp_foo<static_cast<FuncT>(lambda)>(3);
temp_foo<MyStruct::foo>(3);
}
具体来说,GCC 抱怨 lambda 和嵌套类的方法都没有链接,因此它们不能用作非类型模板参数。
至少对于 lambda 情况,我认为 Clang 是正确的(而 GCC 是错误的),因为(引用 cppreference,转换运算符):
这个转换函数返回的值是一个指针 具有 C++ 语言链接的函数,在调用时具有相同的 调用闭包对象的函数调用运算符的效果 直接。
GCC 是否行为不端?
【问题讨论】:
标签: c++ templates lambda c++17 non-type