![](/img/trans.png)
[英]GCC 10.2 not accepting an lambda empty lambda as a constexpr std::function<void()>
[英]constexpr and std::cout working on function but not in lambda
为什么constexpr
不能用于std::cout
,但适用于printf
?
#include <iostream>
constexpr void f() { std::cout << ""; } //error
constexpr void g() { printf(""); } //ok
为什么std::cout
与lambdas constexpr
?
#include <iostream>
int main () {
auto h = []() constexpr { std::cout << ""; }; //ok
}
从技术上讲,它不适用于任何一种。
来自[dcl.constexr] :
对于既不是默认也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式的计算子表达式,或者对于构造函数,可以是常量初始化函数。一些对象([basic.start.static]), 程序格式错误,无需诊断 。
f()
和g()
永远不是常量表达式( std::cout << x
和printf()
都不是constexpr函数),因此constexpr
声明constexpr
不正确。 但编译器不需要诊断它(在这种情况下,它可能很容易,但在一般情况下......不是那么多)。 您所看到的是您的编译器能够诊断出一个问题而不是另一个问题。
但他们都错了。
它没有。 您需要使用它来强制编译时错误。
constexpr int a = f(), 0; // fails
constexpr int b = g(), 0; // fails
从不产生常量表达式的constexpr
函数是不正确的; 无需诊断。 这意味着编译器会尽最大努力检查是否是这种情况,但是您的程序已经出现错误。 好像gcc看不到printf
不是常量表达式。 定义中的铿锵错误 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.