Это изменение между C и C++, где Microsoft ранее применяла правила C. Как было отмечено в ответе Ремейбела, это было исправлено.
В C, литой до void
или просто с использованием выражения в виде инструкции сам по себе (как в incomplete;
), все еще используется преобразование lvalue-to-rvalue. C вызывает это несколько иначе, но это то же самое преобразование.
В C++ листинг до void
или просто использование выражения как самостоятельного заявления не включает преобразование lvalue-to-rvalue. Это необходимо, потому что C++ делает операторы присваивания возвращает lvalues, поэтому, если преобразование именующих к Rvalue было применено, то
volatile int i;
i = 1;
бы не просто магазин, это также немедленно загрузить потом.
Преобразование lvalue-to-rvalue требует полного типа, даже если значение затем отбрасывается, так как в противном случае невозможно узнать, сколько байтов должно быть прочитано.
Почему это был бы более интересный вопрос. Просто используйте '(void) & incomplete' вместо этого. –
У FWIW, GCC и clang нет никаких проблем с этим. – hvd
Он не компилируется в VS2013, но компилируется в [онлайн-компиляторе Microsoft] (http://webcompiler.cloudapp.net/). Так что это, наверное, просто ошибка. –