为什么不能将不完整的类型转换为 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;
不仅会存储,还会立即加载。
左值到右值的转换需要一个完整的类型,即使值随后被丢弃,否则无法知道应该读取多少字节。
为什么下面的代码会报如下错误?
为什么类型需要完整才能转换为 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 astatic_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;
不仅会存储,还会立即加载。
左值到右值的转换需要一个完整的类型,即使值随后被丢弃,否则无法知道应该读取多少字节。