Это правильно сформированная программа на C ++ 17. Функция constexpr, конечно, может читать (и записывать) непостоянные переменные:
constexpr int f(int i) {
int j=i;
++j;
return i+j; // neither is a constant expression
}
Правило состоит в том, что все, что проверяется в константном выражении, должно быть либо константа или начала жизни во время вычисления выражения. В вашем случае время жизни create
f.x
явно начинается в оценке константного выражения, которое является инициализация из main
'* f
. Однако верно, что ни один объект Foo
не может быть скопирован с помощью константного выражения, которое также не создает этот объект, независимо от того, является ли он constexpr
.
. Единственная другая проблема-кандидат - это если конструктор копирования не был constexpr, но эти требования очень слабые . Единственные релевантные: инициализировать каждый (не вариантный) член, что, безусловно, выполняется, и использовать его как минимум в одном константном выражении, которое было продемонстрировано.