【问题标题】:Cast instance to void?将实例转换为无效?
【发布时间】:2017-04-10 13:11:28
【问题描述】:

这个问题可能没有什么实际价值,但我只是想了解这里发生了什么。我有一堂课:

#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 未按预期使用时,为什么允许我定义它?

【问题讨论】:

    标签: c++ casting void


    【解决方案1】:

    “cast to void”,无论其拼写如何,都是一个丢弃的值表达式。它不构成转换,因此不考虑转换函数。

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

    【讨论】:

    • 换句话说:“无论转换为 void 做什么,它都会返回 void,因此可以安全地忽略,因此也不需要实际执行转换”,对吧?
    • @tobi303:更像是,强制转换为 void 是丢弃的值表达式,而不是转换。
    • 嗯好的,我不明白是否有任何方法可以直接调用该运算符。我也试过f.void();,但这当然也没有意义。
    • @tobi303:当然:f.operator void();
    • @SanderDeDycker 啊酷,我一直认为编码是从无到有,现在我什至可以用我自己的方式把东西变成无:)。说真的,谢谢,根本不知道这种语法。
    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2010-10-30
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多