当我调用函数而不将其返回值分配给变量时会发生什么? [复制]

2023-12-06

假设我有以下功能:

int foo()
{
    return 1234;
}

调用此函数而不将其返回值分配给任何变量的效果是什么:

foo();

另外,使用运算符而不将其返回值分配给任何变量的效果是什么:

1 + 2 + 3;

在 C++ 中,表达式是有效的语句;计算出的值被简单地丢弃。

有些编译器足够聪明,如果代码看起来很奇怪,它们会发出警告;例如有:

foo(1,2,3);

可以有意义(调用可能有副作用的函数)但代码如下

x < 3;

没有用,因为它没有定义的副作用并且该值被丢弃。

在 g++ 中,还有一些库函数,尽管有副作用,但仍被专门标记,以便忽略返回值会引发警告(例如fread)因为这是虫子等待咬人的迹象。

还有一些非常常见的情况,经常会忽略函数的结果(例如printf)并且其中返回值的表达式仅用于副作用(例如std::cout << "Hello";).

如果您想在运行时强制执行函数的结果不会被默默忽略,有时可以使用一个技巧:

template<typename T>
struct must_check {
    T x;
    bool checked;
    must_check(const T& x) : x(x), checked(false) {}
    operator T () { checked = true; return x; }
    ~must_check() {
        if (!checked)
          throw std::runtime_error("Result value has not been checked");
    }
};

现在而不是写

int square(int x) {
    return x * x;
}

写吧

must_check<int> square(int x) {
    return x * x;
}

然后代码如下

square(12);

会在运行时抛出异常,而

int result = square(12);

会工作得很好。

这是可能的,但并不是一个真正的好主意,因为在析构函数中抛出异常是一种非常糟糕的行为,通常会导致程序异常终止(原因是有时由于异常而自动调用析构函数,抛出异常)another该阶段的异常是致命的举动)。

UPDATE

C++17 引入了一个注释,以便丢弃可疑的返回值可以在编译时发出警告。例如代码

[[nodiscard]] double square(double x) {
    return x*x;
}

如果不使用返回值,将在编译时触发警告。

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

当我调用函数而不将其返回值分配给变量时会发生什么? [复制] 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 按成员序列化

    我已经实现了template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 正则表达式使用Python正则表达式在文件中查找函数调用?

    我想要一个正则表达式 我将把它与 Python re 模块一起使用 它将在 python 文件中查找 python 函数调用 但我正在查找的函数调用周围会有一些警告 函数调用将有一个特定的名称 函数调用可以是链式的 但只有一个链式调用始终具
  • 传奇中的公共交通延迟响应

    我正在研究在公共交通中使用传奇来协调跨多个服务的活动 传奇的生命周期很短 如果一切顺利的话不到 2 秒 对于我的用例 我想使用请求 响应方法 即客户端请求命令 saga 处理该命令 在接收消息时经历一些状态更改 并最终响应启动 saga 的
  • 添加同一片段的多个实例

    我正在尝试将同一片段的多个实例添加到活动中 示例代码是 FragmentManager fm getSupportFragmentManager Fragment fragment fm findFragmentById R id frag
  • 对象... 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Java 中的 是什么意思 Java 数组参数 声明 语法 谁能确认我所看到的是否正确Object 下面的方法调用中的参数 public static void setValues PreparedS
  • 使用 opencv 计算虚拟相机的单应性

    我有一个平面图像 我想计算一个图像扭曲 它可以为我提供从位于 3d 空间中另一个点的虚拟相机看到的同一平面的合成视图 因此 给定图像 I1 我想计算代表从虚拟相机看到的图像 I1 的图像 I2 理论上 存在将这两个图像关联起来的单应性 给定
  • 如何使 LinearLayout 可滚动?

    我的屏幕上有很多项目 我需要使用滚动条 以便用户可以向下滚动 但是 滚动条要么不可见 要么不起作用 如何给页面添加滚动条LinearLayout 用 a 包裹线性布局
  • 如何在 Perl 中从 HTML 中提取 URL 和链接文本?

    我之前问过如何在 Groovy 中做到这一点 但是 由于所有 CPAN 库 现在我正在用 Perl 重写我的应用程序 如果页面包含这些链接 a href http www google com Google a a href http ww
  • 如何设置网站图标?

    我正在尝试做一个非常简单的初步练习来建立一个创建网站图标的网站 这是我正在使用的代码 但它不起作用 有人可以帮忙吗 我已将文件 favicon ico 保存在与 html 文件相同的级别 在子目录中 非常感谢 随着 i android wi
  • 什么是 .pid 文件以及它包含什么?

    我最近遇到了一个扩展名为 pid 的文件 并查看了它的内部 但没有找到太多内容 这文档 says Pid 文件是包含进程标识号 pid 的文件 该文件存储在文件系统的明确定义位置 从而允许其他程序找到正在运行的脚本的 pid 任何人都可以对
  • 关于 Objective-C/Cocoa 中工厂方法对象生命周期的问题(保留或不保留...)

    通过阅读 SDK 中的内存管理文档 我发现工厂方法 静态构造函数方法 通常会为我保留该对象并将其添加到自动释放池中 这意味着只要池没有在我预期之前释放 我就不需要保留和释放对象 对于 main 中的默认自动释放池 这应该位于应用程序的末尾
  • 在多个号码字段中搜索多个号码

    ID 1 5 1 6 3 4 1 36 1 我有这些 1 6 36 要搜索的号码 它应该找到包含 1 OR 6 OR 36 的任何行 例如上表中总共 4 行 I tried FIND IN SET ID 1 6 36 ID IN 1 6 3
  • AngularJs 无限循环

    以下index html页面导致无限循环 重现 在 本地或远程 Web 服务器上下载下面链接的 github 项目 我已经在 plunker 上尝试过 并且没有发生无限循环 从您的浏览器请求它 单击页面上的 p1p2 链接 无限循环开始 在
  • MySQL5.6卡在进程“试图启动服务”上

    我获得了适用于 Windows 7 32 位的 MySQL 5 6 社区服务器版本 还下载了相同 Windows 版本的 Windows 安装程序 一切准备都正确 我在博客上看到给我一份在 winodws7 32 位上安装 MySQL 5
  • 如何找到向量的重复元素并输出该重复项的整数外观而不是逻辑值?

    我们知道 duplicate 函数输出一个逻辑向量 然而 我想要的是一个整数向量 如果这是该特定元素第 n 1 次出现 则输出向量的相应元素为 n 例如 如果我们调用我正在寻找的函数 intDuplicate 那么我需要以下输出 gt x
  • 在 C 中从文件中读取长行时处理内存

    首先 我知道这个问题非常接近这个话题 但是这个问题的措辞非常糟糕 我什至不确定它是重复的 而且没有显示代码 所以我认为应该正确地询问它 我正在尝试逐行读取文件 并且我需要将一行特别存储在variable 我已经成功地使用轻松地做到了这一点f
  • android:如何使用模拟(假)坐标修复GPS?

    当 GPS 信号不可用时 我尝试以编程方式修复 GPS 我想这样做是为了向其他应用程序 如谷歌地图和其他应用程序 提供模拟坐标 我尝试使用 GPS PROVIDER 和 NETWORK PROVIDER 但只有后者我才能获得对谷歌地图有效的
  • 错误:无法获取现有工作区:container.Client#ListBlobs:

    Error Failed to get existing workspaces containers Client ListBlobs Failure responding to request StatusCode 403 Origina
  • Laravel 路由变化

    我有一个类别表 如下所示 id parent id name 1 0 electronics 2 1 Televisions 3 2 LCD TVs 4 2 Plasma Tvs 5 1 DVD Players 6 1 Bluray Pla
  • HTML5 - 一起开始音频和视频?

    我该如何让音频和视频同时开始使用
  • 当我调用函数而不将其返回值分配给变量时会发生什么? [复制]

    这个问题在这里已经有答案了 假设我有以下功能 int foo return 1234 调用此函数而不将其返回值分配给任何变量的效果是什么 foo 另外 使用运算符而不将其返回值分配给任何变量的效果是什么 1 2 3 在 C 中 表达式是有效