constexpr 和 std::cout 适用于函数,但不适用于 lambda

2023-11-22

Why constexpr不适用于std::cout,但适用于printf?

#include <iostream>
constexpr void f() { std::cout << ""; } //error
constexpr void g() { printf(""); } //ok

And why std::cout与 lambda 一起使用constexpr?

#include <iostream>
int main () {
    auto h = []() constexpr { std::cout << ""; }; //ok
}

从技术上讲,它不适用于其中任何一个。

From [dcl.constexr]:

对于既不是默认值也不是模板的 constexpr 函数或 constexpr 构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式的计算子表达式,或者对于构造函数,可以是常量初始值设定项一些对象([basic.start.static]),该程序格式错误,无需诊断.

f() and g()从来都不是常量表达式(也不是std::cout << x nor printf()是 constexpr 函数),所以constexpr声明格式不正确。但编译器不是required诊断这一点(在这种情况下,可能很容易,但在一般情况下......不是那么容易)。您所看到的是,您的编译器能够诊断一个问题,但不能诊断另一个问题。

但他们都错了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

constexpr 和 std::cout 适用于函数,但不适用于 lambda 的相关文章

随机推荐