constexpr和std :: cout在函数上起作用,但不在lambda中

Joã*_*ulo 8 c++ cout constexpr c++17

为什么constexpr不使用std::cout,但可以使用printf

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

为什么std::cout使用lambdas constexpr

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

Bar*_*rry 11

从技术上讲,它对任何一个都不起作用。

来自[dcl.constexr]

对于既没有默认值也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,使得对该函数或构造函数的调用可以是核心常量表达式的求值子表达式,或者对于构造函数而言,该常量初始化器用于某些对象([basic.start.static]),程序格式错误,不需要诊断

f()并且g()永远都不是常量表达式(std::cout << x也不printf()是constexpr函数),因此constexpr声明的格式不正确。但是不需要编译器来诊断(在这种情况下,这可能很容易,但是在一般情况下……不是很多)。您看到的是编译器能够诊断一个问题,而不能诊断另一个问题。

但是他们都错了。


Rak*_*111 7

没有。您需要使用它来强制编译时错误。

constexpr int a = f(), 0; // fails
constexpr int b = g(), 0; // fails
Run Code Online (Sandbox Code Playgroud)

constexpr从不产生常量表达式的函数格式错误;无需诊断。这意味着编译器会尽力检查是否是这种情况,但是您的程序已经有两种错误。好像gcc看不到printf不是常量表达式。在定义时发出lang铛错误

  • 很好地使用逗号运算符:) (2认同)