为什么不能将不完整的类型转换为 void?

Why can't an incomplete type be casted to void?

为什么下面的代码会报如下错误?

为什么类型需要完整才能转换为 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'

我没有看到任何禁止这样做的内容,引用 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, an online VS2013 compiler, but compiles in rise4fun 上测试的错误,Microsoft 的在线编译器是最前沿的。

这是 C 和 C++ 之间的变化,Microsoft 以前在 C++ 中实现了 C 规则。正如 remyabel 的回答中所述,此问题已得到修复。

在 C 语言中,强制转换为 void,或者简单地使用表达式本身作为语句(如 incomplete;),仍然涉及左值到右值的转换。 C 调用它略有不同,但它是相同的转换。

在 C++ 中,强制转换为 void,或仅将表达式用作语句本身并不涉及左值到右值的转换。这是必需的,因为 C++ 使赋值运算符 return 成为左值,因此如果应用了左值到右值的转换,则

volatile int i;
i = 1;

不仅会存储,还会立即加载。

左值到右值的转换需要一个完整的类型,即使值随后被丢弃,否则无法知道应该读取多少字节。