繁体   English   中英

constexpr和std :: cout处理函数但不处理lambda

[英]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 << xprintf()都不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM