Почему неполный тип не может быть приведен к пустоте?

Почему следующий код выдает следующую ошибку?

Почему тип должен быть завершен, чтобы его можно было привести к 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'
4 голоса | спросил Mehrdad 21 MarpmSat, 21 Mar 2015 12:00:58 +03002015-03-21T12:00:58+03:0012 2015, 12:00:58

2 ответа


0

Это изменение между C и C ++, где Microsoft ранее реализовала правила C. Как отмечается в ответе Ремьябеля, это было исправлено.

В C приведение к void или простое использование выражения как оператора (как в incomplete;), все еще включает преобразование lvalue в rvalue. C называет это немного по-другому, но это то же самое преобразование.

В C ++ приведение к void или простое использование выражения в качестве оператора само по себе не включает lvalue-to -значение конверсии. Это необходимо, потому что C ++ заставляет операторы присваивания возвращать lvalue, поэтому, если было применено преобразование lvalue в rvalue, то

volatile int i;
i = 1;

не просто хранит, но и сразу же загружается.

Для преобразования lvalue в rvalue требуется полный тип, даже если значение затем отбрасывается, поскольку в противном случае невозможно узнать, сколько байтов следует прочитать.

ответил 21 MarpmSat, 21 Mar 2015 12:27:54 +03002015-03-21T12:27:54+03:0012 2015, 12:27:54
0

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

  

§5.4 /4 Преобразования, выполненные

     

[...]

     

- a static_cast (5.2.9),

     

[...]

     

может выполняться с использованием приведенной нотации явного преобразования типов.

     

§5.2.9 /5 В противном случае static_cast должен выполнить одно из   преобразования, перечисленные ниже. Никакое другое преобразование не должно выполняться   явно используя static_cast.

     

§5.2.9 /6 Любое выражение может быть явно преобразовано в тип cv void,   в этом случае оно становится выражением отброшенного значения (пункт 5).   [...]

Скорее всего, это ошибка, протестированная на Rextester , онлайн-компиляторе VS2013, но компилируемый в rise4fun , онлайновый компилятор Microsoft, который находится на переднем крае.

ответил 21 MarpmSat, 21 Mar 2015 12:15:06 +03002015-03-21T12:15:06+03:0012 2015, 12:15:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132