将实例转换为void?

时间:2017-04-10 13:11:28

标签: c++ casting void

这个问题可能具有很小的实用价值,但我只是想了解这里发生了什么。我有一节课:

#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都没有调用我的转换运算符? (同样,如果我将void替换为int,则所有三个版本都会调用我的operator int
  • 我可以接受这是void投射的方式,但是为什么我可以在没有按照我预期使用的情况下定义operator void

1 个答案:

答案 0 :(得分:4)

&#34;转换为void&#34;但是拼写是丢弃的值表达式。它不构成转换,因此不考虑转换函数。

C ++允许你做很多没有意义的事情;一些特殊情况禁止比仅仅保留一般规则更难。