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

时间:2019-06-12 18:20:28

标签: c++ c++17 constexpr cout

为什么void FixedUpdate( { if (Input.GetKey(KeyCode.Q)) rb.MoveRotation(rb.rotation + angularSpeed * Time.deltaTime); if (Input.GetKey(KeyCode.E)) rb.MoveRotation(rb.rotation + -angularSpeed * Time.deltaTime); rb.MovePosition(transform.position + Vector3.up * speed * Time.deltaTime); } 不能与constexpr一起使用,但是可以与std::cout一起使用?

printf

为什么#include <iostream> constexpr void f() { std::cout << ""; } //error constexpr void g() { printf(""); } //ok 与lambda std::cout一起使用?

constexpr

2 个答案:

答案 0 :(得分:11)

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

来自[dcl.constexr]

  

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

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

但是他们都错了。

答案 1 :(得分:7)

不是。您需要使用它来强制编译时错误。

constexpr int a = f(), 0; // fails
constexpr int b = g(), 0; // fails

constexpr永远不会产生常量表达式的函数格式错误;无需诊断。这意味着编译器会尽力检查是否是这种情况,但是您的程序已经有两种错误。好像gcc看不到printf不是常量表达式。 clang errors at the definition