У меня есть простой класс constexpr (с использованием c ++ 17)
struct foo {
float x, y;
// ill formed constexpr in vs 2015
foo() {}
constexpr foo(float x, float y) : x(x), y(y) {
}
};
constexpr auto bar() {
return foo(4.0, 5.0);
}
int main() {
auto f = bar();
}
Это неверно сформированный b c конструктора по умолчанию не constexpr по умолчанию в 2015 году. Но против 2019 не сообщается о проблеме.
Согласно эта справочная страница"все выбранные ctors" должна быть constexpr. Я предполагаю, что слово «выбранный» означает «использованный», и хотя ctor по умолчанию не используется, 2015 не превратится в constexpr, пока я не сделаю ctor constexpr по умолчанию.
Другие спецификации сформулированы по-другому, но я не мог объяснить из них тоже. Также в большинстве примеров constexpr везде используется ключевое слово. Было бы неплохо использовать выборочное использование constexpr.
Последние версии GNU и Clang ведут себя так же, как и в 2019 году, но я не уверен, что в 2015 году это было упущением или ошибкой.
Так что же это? Должны ли все ctors быть constexpr или Visual Studio 2019 здесь правильно?