0 as Float
这里的问题是,我不能在此constexpr函数中执行I / O操作以进行调试。那么,有什么方法可以在constexpr函数中进行I / O操作吗?或者这是C ++中的限制/行为吗?
答案 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;
我们可以从[expr.const]p2看到我们仅限于调用constexpr
函数:
调用常量类或constexpr函数的constexpr构造函数以外的函数[注意:重载分辨率([over.match])照常应用—尾注];
和cout
和其他I / O功能未标记为constexpr
。
C ++ 14的行情类似于[dcl.constexpr]p5和[expr.const]p2。