为什么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
答案 0 :(得分:11)
从技术上讲,它对任何一个都不起作用。
对于既没有默认值也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,使得对该函数或构造函数的调用可以是核心常量表达式的求值子表达式,或者对于构造函数,则为常量初始化程序,用于某些对象([basic.start.static]),程序格式错误,无需诊断。
f()
和g()
从来都不是常数表达式(std::cout << x
和printf()
都不是constexpr函数),因此constexpr
声明格式错误。但是不需要编译器来诊断(在这种情况下,这可能很容易,但是在一般情况下……并不是很多)。您看到的是编译器能够诊断一个问题,而不能诊断另一个问题。
但是他们都错了。
答案 1 :(得分:7)
不是。您需要使用它来强制编译时错误。
constexpr int a = f(), 0; // fails
constexpr int b = g(), 0; // fails
constexpr
永远不会产生常量表达式的函数格式错误;无需诊断。这意味着编译器会尽力检查是否是这种情况,但是您的程序已经有两种错误。好像gcc看不到printf
不是常量表达式。 clang errors at the definition。