是否可以在constexpr函数中执行I / O

时间:2018-10-20 06:49:14

标签: c++ c++11 c++14 constexpr

0 as Float

这里的问题是,我不能在此constexpr函数中执行I / O操作以进行调试。那么,有什么方法可以在constexpr函数中进行I / O操作吗?或者这是C ++中的限制/行为吗?

1 个答案:

答案 0 :(得分:3)

根据C++11 [dcl.constexpr]p5,目前您所拥有的病历不正确,无需诊断:

  

对于constexpr函数,如果不存在函数参数值,例如   函数调用替换将产生一个常数   表达式([expr.const]),程序格式错误;没有诊断   需要。对于constexpr构造函数,如果不存在任何参数值   这样,在函数调用替换之后,每个构造函数   mem初始化程序中的call和full-expression将是一个常数   表达式(包括转换),则该程序格式不正确;没有   需要诊断。 [示例:

constexpr int f(bool b)
  { return b ? throw 0 : 0; }               // OK
constexpr int f() { throw 0; }              // ill-formed, no diagnostic required

struct B {
  constexpr B(int x) : i(0) { }             // x is unused
  int i;
};

int global;

struct D : B {
  constexpr D() : B(global) { }             // ill-formed, no diagnostic required
                                            // lvalue-to-rvalue conversion on non-constant global
};
     

—结束示例]

,如果您尝试在需要常量表达式的上下文中使用它,这将成为硬错误,例如:

constexpr test obj;

see godbolt example live

我们可以从[expr.const]p2看到我们仅限于调用constexpr函数:

  

调用常量类或constexpr函数的constexpr构造函数以外的函数[注意:重载分辨率([over.match])照常应用—尾注];

cout和其他I / O功能未标记为constexpr

C ++ 14的行情类似于[dcl.constexpr]p5[expr.const]p2