为什么在转换为函数指针时,lambda可以在constexpr上下文中使用?

时间:2016-12-16 15:26:45

标签: c++ lambda language-lawyer constexpr

考虑一个例子:

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;没有联系

clang

  

prog.cc:7:8:注意:非constexpr函数&#39; operator void(*)()&#39;不能用于常量表达式

1 个答案:

答案 0 :(得分:10)

Clang hasn't implemented constexpr lambdas yet

海湾合作委员会以其他方式落后。 [temp.arg.nontype]/2唯一有趣的约束是参数应该是一个常量表达式。但是[expr.const]/(5.2)使它成为一个,所以这是完全有效的。也许海湾合作委员会尚未实施N4198,这消除了联系要求。

请注意,_run-with-bundler:5: fork failed: resource temporarily unavailable zsh: fork failed: resource temporarily unavailable lambda和no-linkage函数指针模板参数都是C ++ 14后的特性。