C ++ 20 будет иметь новый consteval ключевое слово и деструктор constexpr Если все будет хорошо. К сожалению, ни один из известных мне компиляторов не реализует consteval в это время. Будет ли действителен следующий код?
struct A {
constexpr ~A() {}
};
consteval A f() {
return A{};
}
void test() {
A a;
a = f(); // <-- here
}
Проблема возникает из отмеченной мною строки - необходимо вызвать деструктор временного A
, возвращаемого f
. но его следует вызывать в конце полного выражения. так что вне непосредственной оценки.
Я не нашел цитат из consteval и деструктор constexpr документы, которые прямо запрещают это, но я не понимаю, как это может быть правильно.
Будет ли следующий код действителен в C ++ 20? Что должно произойти с этим кодом?
Примечание:
В consteval paper это приведен пример. Здесь функция consteval вызывается вне постоянного контекста.
consteval int sqr(int n) {
return n*n;
}
constexpr int r = sqr(100); // Okay.
int x = 100;
int r2 = sqr(x); // Error: Call does not produce a constant.
constexpr int dblsqr(int n) { return 2*sqr(n); // Error: Enclosing function is not } // consteval.
часть? - person NathanOliver   schedule 14.10.2019constexpr int dblsqr(int n) { return 2*sqr(n); // Error: Enclosing function is not } // consteval.
заключается в том, что аргумент, передаваемый функции consteval, неизвестен во время компиляции или, возможно, не известен. - person Tyker   schedule 14.10.2019