Рассмотрим следующий фрагмент, чтобы проверить предстоящие объявления декомпозиции функций С++ 17 (ранее известные как структурированные привязки)
#include <cassert>
#include <utility>
constexpr auto divmod(int n, int d)
{
return std::make_pair(n / d, n % d); // in g++7, also just std::pair{n/d, n%d}
}
int main()
{
constexpr auto [q, r] = divmod(10, 3);
static_assert(q == 3 && r ==1);
}
Это не работает как g++ 7-SVN, так и clang-4.0-SVN с сообщением:
Объявление декомпозиции не может быть объявлено "constexpr"
Отбрасывание определения constexpr
и переход на обычный assert()
работает на обоих компиляторах.
Ни одна из работ РГ21 по этой функции не упоминает ключевое слово constexpr
, ни в положительном, ни в отрицательном.
Вопрос: почему объявления с декомпозицией не могут быть constexpr
? (кроме "потому что стандарт говорит так" ).