为什么以下代码会出现以下错误?
为什么类型需要完整才能投放到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'
答案 0 :(得分:6)
这是C和C ++之间的变化,Microsoft以前在那里实现了C规则。正如雷米亚贝尔的回答所指出的那样,已经修复了。
在C中,强制转换为void
,或者仅仅将表达式用作语句(如incomplete;
),仍然涉及左值到右值的转换。 C称之为略有不同,但它的转换是相同的。
在C ++中,转换为void
,或者仅仅将表达式用作语句本身不涉及左值到右值的转换。这是必需的,因为C ++使赋值运算符返回左值,所以如果应用了左值到右值的转换,那么
volatile int i;
i = 1;
不仅会存储,而且会在之后立即加载。
左值到右值的转换需要一个完整的类型,即使该值被丢弃,否则,不可能知道应该读取多少字节。
答案 1 :(得分:3)