vs 2015 переменная constexpr непостоянна, но хороша по сравнению с 2019? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть простой класс 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 здесь правильно?

1 Ответ

2 голосов
/ 19 февраля 2020

Никогда не было требования, чтобы все конструкторы литерального типа были constexpr. Требованием было только то, что все функции, которые вызываются в контексте константных выражений, должны иметь возможность быть константными выражениями (и, следовательно, должны быть объявлены constexpr).

Обратите внимание, что более старые версии Visual Studio не делали хорошая работа по реализации constexpr правильно.

...