为什么不使用强制转换语法调用“operator void”?

2024-03-12

玩的时候这个答案 https://stackoverflow.com/questions/4030959/will-a-variablename-c-statement-be-a-no-op-at-all-times/4030983#4030983 by 用户GMan https://stackoverflow.com/users/87234/gman我制作了以下代码片段(用 Visual C++ 9 编译):

 class Class {
 public:
     operator void() {}
 };

 Class object;
 static_cast<void>( object );
 (void)object;
 object.operator void();

使用调试器单步执行后,我发现转换为void不调用Class::operator void(),只有第三次调用(显式调用运算符)实际上调用了运算符,这两个强制转换什么也不做。

为什么是operator void不使用强制转换语法调用?


其技术原因可在第 12.3.2 节中找到:

转换函数永远不会用于将(可能是 cv 限定的)对象转换为(可能是 cv 限定的)相同对象类型(或对其的引用),转换为该类型的(可能是 cv 限定的)基类(或对其的引用),或(可能符合简历资格)无效.

理由是(可能)允许 §5.2.9/4 发挥作用:

任何表达式都可以显式转换为类型“cv void”。表达式值被丢弃。

(void)expr假设对结果值不做任何事情any表达式,但如果它调用您的转换运算符,它不会丢弃任何内容。所以他们禁止使用operator void在转换中。


为什么不将转换类型 ID 设为格式错误void?谁知道呢,但请记住,事实并非如此totally无用:

struct foo
{
    operator void()
    {
        std::cout << "huh?" << std::endl;
    }

};

typedef void (foo::*void_function)();

foo f;
void_function func = &foo::operator void;

(f.*func)(); // prints "huh"
f.operator void(); // also does (which you knew)

它在技术上仍然具有潜在用途某物,所以也许这是足够的理由,不会使其格式错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不使用强制转换语法调用“operator void”? 的相关文章

随机推荐

  • 在本地处理预期错误、重新抛出意外错误的模式

    有时 某些代码会以预期的方式引发错误 最方便的方法是在本地处理它 而不是将其扔到错误处理例程中 在错误处理例程中它将与相同类型的其他错误混合在一起 然而 您不希望意外错误被吞没 你希望他们像往常一样长大 在下面的 稍微做作的 示例中 Fin
  • 如何关闭故事板弹出窗口

    我创建了一个弹出窗口UIBarButtonItem使用 Xcode Storyboards 因此没有代码 如下所示 呈现弹出窗口效果很好 但是 我无法让弹出窗口消失当我点击UIBarButtonItem这让它出现了 当按下按钮 第一次 时
  • php与dll的通信?

    我需要使用 php 将数据 在本例中只是一个 id 传递到自定义 dll 可以直接在php中使用dll吗 以前从未使用过 dll 我不太确定它是如何工作的 它本质上与 Web 服务或 RPC 类似吗 由于这是一个自定义 DLL 也许您会考虑
  • 在android中解码HTML实体

    我需要解码 HTML 实体 例如从 到 和 到 URLEncoder decode str 不做这项工作 从 符号转换 TextUtils 有 HTMLencode 但没有 HTMLdecode 有没有解码 HTML 实体的函数 The h
  • ASP.net Session_Start 方法中的依赖注入

    我正在学习依赖注入并第一次使用 autofac 我按照几个 autofac 示例 见下文 中提到的方式构建了容器 并从我的 application start 调用 public class ContainerConfig public s
  • 锁定静态方法

    请考虑这段代码 public static class SomeClass private static List
  • Excel-在数组中查找一个项目并返回顶列

    我有一个按列排列的信息表 我有要在表中查找的值 但结果无法获取列标题 尝试了查找 匹配和索引 不确定我想要做什么 因为查找遍及整个表 在此输入图像描述 https i stack imgur com gSb8j png 解决这个问题的方法有
  • 调用 isSumbitted() 和 isValid() 会导致“未定义方法”错误

    我有一个从控制器中的 createFormBuilder 创建的 Symfony 表单 但在两个 IF 语句下 表单应包含两组不同的字段 我的 Symfony 版本是 3 4 src AppBundle Controller Default
  • UISearchController 在 segue 之后持续存在

    我有一个带有 UISearchController 的应用程序 UI 的这个元素完全是用如下代码设置的 searchController UISearchController searchResultsController nil sear
  • 如何在 Xcode 4.2 中启用 ARC 项目范围

    我有一个 iOS 应用程序 我想将其转换为使用ARC 我只想使用迁移工具 但在预览阶段它始终会出错 我知道我可以使用 fobjc arc逐个文件的编译器指令 但我想启用ARC在整个项目上 然后使用关闭各个类 fno objc arc 4 2
  • 如何对字符串版本号的列表/数组进行排序?

    我有一个版本字符串列表 参见照片 我想按降序对它们进行排序 我见过一些使用 Version 类来比较它们的解决方案 但我想不出有任何解决方案可以像这样对整个列表进行排序 实现这一目标的最简单的方法是什么 这个简单的实现有什么问题吗 usin
  • 从 iisnode 访问 web.config 设置?

    如果我将设置添加到应用程序的 web config 文件中 是否有 API 可以从我的应用程序中读取设置 或者我是否必须使用 XML 库读取该文件 没有特殊的 API 允许您将 web config 读取到在 iisnode 中运行的 No
  • Qt5中的glGenBuffers在哪里?

    我似乎找不到glGenBufferQt5 中的函数 我的包含列表看起来像 include
  • ViewModel 属性在 HttpPost 上保持为 null

    我完全感到困惑的是 这个简单的概念似乎不起作用 我有一个 ViewModel 一个控制器和一个视图 这是我的基本 ViewModel public class CreateProfessionalEducationViewModel pub
  • 如何设计一个布局可能随时间变化的通用数据库?

    这是一个棘手的问题 如何以编程方式创建和查询一个我无法真正预见其内容的数据库 我正在实现一个通用输入表单系统 用户可以创建具有所见即所得布局的 PHP 表单 并将其用于他希望的任何目的 他还可以查询输入 所以 我们分为三个阶段 设计并生成表
  • 如何使用 pandas DataFrame 在列轴连接中使用 join_axes ?

    数据集 df2 pd DataFrame A 1 2 B 3 4 df3 pd DataFrame A 5 6 7 B 8 9 10 C 11 12 13 我只能使用join axes在 按行 串联时axis 1如下所示 pd concat
  • 当脚本部署为 Web 应用程序时,如何在 Google 电子表格中获取活动范围/选择?

    我发现像 getActiveRange getActiveSelection 这样的函数仅当脚本作为电子表格或容器扩展中的自定义函数运行时才起作用 请参阅脚本的执行方法 https developers google com apps sc
  • 在 Eclipse 中停止 Tomcat 10 时出现 ClassCastException

    我正在使用 Eclipse 2022 06 和 Tomcat 10 0 10 通常 当关闭 Eclipse 中运行的 Tomcat 时 我会得到 WARNUNG Failed to clear soft references from Ob
  • 如何通过 TestFlight 测试 Facebook Audience Network 广告?

    我正在尝试将 Audience Network 集成到我的应用程序中 当我通过 XCode 部署时 广告在模拟器和设备上正常工作 我想通过 TestFlight 分发构建 以确保它能够在发布模式下工作 当我尝试在发布模式下直接从 XCode
  • 为什么不使用强制转换语法调用“operator void”?

    玩的时候这个答案 https stackoverflow com questions 4030959 will a variablename c statement be a no op at all times 4030983 40309