ошибки constexpr; Регресс компилятора С++ VS2017?

Только что установил VS2017, который утверждает, что имеет превосходную поддержку С++ 14 с 2015 года (что было в зачаточном состоянии). Попробовал один из моих проектов, в котором используется constexpr, и заметил некоторые регрессии.

Этот код:

struct s
{
    size_t i;
    constexpr s(nullptr_t) noexcept : i(0) {}
};
static_assert(s(nullptr).i == 0, "!!");

Компилируется без проблем на VS2015 и Clang, но я получаю новую ошибку в VS2017:

error C2131: expression did not evaluate to a constant
note: failure was caused by unevaluable pointer value
note: while evaluating 's::s(&s{(null)})'

Этот код выглядит нормально, верно? У constexpr должна быть проблема с nullptr?
Я удивлен, что эта базовая регрессия может появиться, я подозреваю, что с моим кодом что-то не так...


person Manu Evans    schedule 21.03.2017    source источник
comment
Даже просто constexpr s x{nullptr}; вылетает с бессмысленными ошибками (note: while evaluating 's::s(&x)' — что??); явно баг.   -  person ildjarn    schedule 21.03.2017
comment
Меня удивляет, что что-то настолько простое и тривиальное могло пропустить юнит-тесты компилятора...   -  person Manu Evans    schedule 21.03.2017
comment
Еще один фрагмент кода, вызывающий ту же ошибку в самой простой процедуре разделения строк: while (*tmp) { if (a_delim == *tmp) { count++; last_comma = tmp; } tmp++; }   -  person ibanjo    schedule 22.03.2017
comment
@ibanjo: Какова связь кода, который вы разместили, с той же ошибкой?   -  person AnT    schedule 26.03.2017
comment
@Manu Evans: Во-первых, обычно простые и тривиальные вещи пропускают модульные тесты. Сложный функционал часто взаимодействует с несколькими тестами, запуская хотя бы один из них. Во-вторых, даже если ваш код короткий, семантика лежащего в его основе языка не обязательно проста и тривиальна.   -  person AnT    schedule 26.03.2017
comment
@AnT Я проверил и на самом деле неправильно понял сообщение. Извиняюсь.   -  person ibanjo    schedule 26.03.2017
comment
@AnT: Конечно, но вы должны признать, что это впечатляющий провал модульных тестов ... никогда не тестировал nullptr с constexpr, в любом контексте, вообще   -  person Manu Evans    schedule 26.03.2017


Ответы (1)


Конструктор constexpr (std::nullptr_t) вызывает «ошибку C2131: выражение не оценивается как константа»

Об этой проблеме было сообщено как ошибка в Visual Studio 2017 версии 15.1.
Был вариант другого проблема, о которой ранее сообщил OP (?).

Это было исправлено в: Visual Studio 2017 версии 15.6, предварительная версия 1.

person P.W    schedule 12.10.2018
comment
Хотел убрать этот вопрос из списка неотвеченных. - person P.W; 12.10.2018