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

时间:2015-03-21 09:00:58

标签: c++ void incomplete-type

为什么以下代码会出现以下错误?

为什么类型需要完整才能投放到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 个答案:

答案 0 :(得分:6)

这是C和C ++之间的变化,Microsoft以前在那里实现了C规则。正如雷米亚贝尔的回答所指出的那样,已经修复了。

在C中,强制转换为void,或者仅仅将表达式用作语句(如incomplete;),仍然涉及左值到右值的转换。 C称之为略有不同,但它的转换是相同的。

在C ++中,转换为void,或者仅仅将表达式用作语句本身不涉及左值到右值的转换。这是必需的,因为C ++使赋值运算符返回左值,所以如果应用了左值到右值的转换,那么

volatile int i;
i = 1;

不仅会存储,而且会在之后立即加载。

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

答案 1 :(得分:3)

我没有看到任何禁止这一点,引用N4140:

  

§5.4/ 4由

执行的转换      

[...]

     

- static_cast(5.2.9),

     

[...]

     

可以使用显式类型转换的强制转换表示法执行。

     

§5.2.9/ 5否则,static_cast将执行其中一项   下面列出的转化次数。不得进行其他转换   明确使用static_cast

     

§5.2.9/ 6任何表达式都可以显式转换为cv void类型,   在这种情况下,它成为废弃值表达式(第5条)。   [...]

这很可能是在Rextester(在线VS2013编译器)上测试的一个错误,但在rise4fun编译,微软的在线编译器是最前沿的。