将实例转换为无效?
Cast instance to void?
这个问题可能没有什么实际价值,但我只是想了解这里发生了什么。我有一个 class:
#include <iostream>
struct Foo{
operator void () {
std::cout << " to void called " << std::endl;
return;
}
};
实际上我不确定是否可以将类型转换为 void
(虽然仍然不确定它是否有意义),但是在阅读 this question 之后我了解到这是可能的至少通过 static_cast
。
现在我的问题是......
void foo() {
Foo f;
//return f; // A // not allowed
return static_cast<void>(f); // B // OK
return (void) f; // C // OK
}
int main() {
foo();
}
- 为什么不允许A? (如果我将
void
替换为 int
显然会起作用)
- 为什么 B 和 C 都不调用我的转换运算符? (同样,如果我用
int
替换 void
,所有三个版本都会调用我的 operator int
)。
- 我可以接受这是转换为
void
的工作方式,但是为什么我可以定义一个 operator void
而它没有像我期望的那样使用?
无论拼写如何,"cast to void" 都是一个 废弃值表达式 。不构成转换,因此不考虑转换函数。
C++允许你做很多没有意义的事情; 禁止一些特殊情况比只保留一般规则更难。
这个问题可能没有什么实际价值,但我只是想了解这里发生了什么。我有一个 class:
#include <iostream>
struct Foo{
operator void () {
std::cout << " to void called " << std::endl;
return;
}
};
实际上我不确定是否可以将类型转换为 void
(虽然仍然不确定它是否有意义),但是在阅读 this question 之后我了解到这是可能的至少通过 static_cast
。
现在我的问题是......
void foo() {
Foo f;
//return f; // A // not allowed
return static_cast<void>(f); // B // OK
return (void) f; // C // OK
}
int main() {
foo();
}
- 为什么不允许A? (如果我将
void
替换为int
显然会起作用) - 为什么 B 和 C 都不调用我的转换运算符? (同样,如果我用
int
替换void
,所有三个版本都会调用我的operator int
)。 - 我可以接受这是转换为
void
的工作方式,但是为什么我可以定义一个operator void
而它没有像我期望的那样使用?
无论拼写如何,"cast to void" 都是一个 废弃值表达式 。不构成转换,因此不考虑转换函数。
C++允许你做很多没有意义的事情; 禁止一些特殊情况比只保留一般规则更难。