2015-03-21 3 views
3

Зачем нужен следующий код:Почему не может быть лишен неполный тип в пустоту?

Почему тип должен быть полным, чтобы быть отлитым до void?

struct Incomplete; 
class Class 
{ 
    virtual void foo(Incomplete &incomplete) 
    { 
     (void) incomplete; 
     throw std::logic_error("not implemented"); 
    } 
}; 

Ошибка:

error C2027: use of undefined type 'Incomplete' 
    see declaration of 'Incomplete' 
+2

Почему это был бы более интересный вопрос. Просто используйте '(void) & incomplete' вместо этого. –

+1

У FWIW, GCC и clang нет никаких проблем с этим. – hvd

+0

Он не компилируется в VS2013, но компилируется в [онлайн-компиляторе Microsoft] (http://webcompiler.cloudapp.net/). Так что это, наверное, просто ошибка. –

ответ

4

Это изменение между 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 требует полного типа, даже если значение затем отбрасывается, так как в противном случае невозможно узнать, сколько байтов должно быть прочитано.

3

Я не вижу ничего, запрещающего это, цитируя N4140:

§5.4/4 The conversions performed by

[...]

— a static_cast (5.2.9),

[...]

can be performed using the cast notation of explicit type conversion.

§5.2.9/5 Otherwise, the static_cast shall perform one of the conversions listed below. No other conversion shall be performed explicitly using a static_cast .

§5.2.9/6 Any expression can be explicitly converted to type cv void, in which case it becomes a discarded-value expression (Clause 5). [...]

Это, скорее всего, ошибка при испытании на Rextester, онлайн VS2013 компилятор, но компилируется в rise4fun, онлайн-компиляторе Microsoft, который истекает кровью.

Смежные вопросы