Я написал этот код:
#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
будет выведен. Потому что каждая статическая инициализация выполняется перед динамической инициализацией. Я не совсем понимаю.
Назначение не инициализация. Назначение от foo(3,4)
происходит после main
начинается (что после инициализации из bar(1,2)
) и перед печатью значения.
a
не объявлено constexpr
поэтому он не может быть инициализирован через constexpr
выражение. В представленном сценарии вторая «инициализация» фактически является динамическим назначением.