我写了这段代码:
#include <cstdlib>
#include <iostream>
#include <stdio.h>
constexpr int foo(int a, int b)
{
return a*b;
}
int bar(int a, int b)
{
return a*b;
}
int a = bar(1,2); // Dynamic initialization. This brace-or-equal initializer
// contains expression which is not a constant expression
int main()
{
a = foo(3,4); // Constexpr function invocation. Static initialization.
std::cout << a; // 12
}
此程序输出12
。我预计会输出2
。因为每个静态初始化都在动态初始化之前执行。我很困惑。
答案 0 :(得分:3)
作业不是初始化。 foo(3,4)
的分配发生在main
开始之后(在bar(1,2)
初始化之后),并且在打印值之前。
答案 1 :(得分:2)
a
未声明为constexpr
,因此无法通过constexpr
表达式对其进行初始化。在您提供的场景中,第二个“初始化”实际上是动态分配。