当前位置: 首页 > 知识库问答 >
问题:

C:是否定义了忽略返回值销毁行为

麹正业
2023-03-14

问题:被忽略的返回值是立即被析构还是在超出范围的时候被析构??

下面的代码返回我的编译器

输出:

谁制造它,谁就不需要它。

谁买了它,它就没用了。

使用它的人既看不到也感觉不到它。

这是怎么一回事?

因此,被忽略的值会被立即析构。但是这个编译器是特定的还是标准行为的呢?

struct foo
{
   ~foo()
   {
      std::cout << "Who makes it, has no need of it. \n"
                << "Who buys it, has no use for it. \n";
   }
}

foo createFoo()
{
   return foo();
}

int main(int argc, char* argv[])
{
     createFoo();
     std::cout << "Who uses it can neither see nor feel it.\n"
               << "What is it?"; 
}

共有3个答案

梁才
2023-03-14

12.2 /3

临时对象在计算包含创建它们的点的完整表达式(1.9)的最后一步被销毁。即使评估以抛出异常结束,也是如此。销毁临时对象的值计算和副作用只与完整表达式相关,而与任何特定的子表达式无关。

构造函数参数以及将引用绑定到临时。(12.3/4f。)

尚棋
2023-03-14

在标准5.11中

在某些情况下,一个表达式的出现仅仅是因为它的副作用。这种表达式称为丢弃值表达式。计算表达式,并丢弃其值。

因此,当表达式结束时,该值将被丢弃,如果它是类类型,则调用析构函数。

常英纵
2023-03-14

返回的临时在完整表达式完成后立即销毁,除非它的生命周期通过绑定到右值或const左值引用而延长。

 类似资料:
  • 本文向大家介绍C++ 返回值省略,包括了C++ 返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回prvalue表达式,并且prvalue表达式的类型与函数的返回类型相同,则可以忽略prvalue临时对象的副本: 在这种情况下,几乎所有编译器都将忽略临时构造。

  • 问题内容: 我有: 在内部,我有一个我不想传递给克隆元素的属性。 我能怎么做? 问题答案: 您可以使用对象rest / spread语法: 我假设您已经基于上面的代码获得了此语法的支持,但是请注意,这是一个建议的语法,可通过babel stage 1预设 提供给您。如果在执行时遇到语法错误,则可以如下安装预设: 然后将其添加到babel配置的“预设”部分。例如,在您的.babelrc文件中: 根据

  • 问题内容: 自从我使用Java以来​​已经有5年了,那时,每当您想分配需要清理的对象(例如套接字,DB句柄)时,都必须记住添加一个块并在其中调用cleanup方法。那里。 相比之下,在C++(或确定对象生存期的其他语言,例如Perl)中,类实现程序将定义一个析构函数,该函数在该类的对象超出范围时执行清除。这种方法的优点是对象的用户不会忘记清理它- 即使抛出异常,析构函数也会被自动调用。这种方法用R

  • 我目前正在学习Spring boot,我一直在测试一个项目——非常感谢任何帮助,因为我是这里的初学者。 我有一个rest控制器测试,使用Mockito,当使用Mockito.when()调用方法时,该测试似乎忽略了Then返回。 这是整个班级: 名为“testCreateUser”的测试没有问题地通过了。给我一个问题的是名为“testFindUserById”的测试。 以下是我尝试测试的控制器方法

  • 本文向大家介绍c++命名的返回值省略,包括了c++命名的返回值省略的使用技巧和注意事项,需要的朋友参考一下 示例 如果从函数返回左值表达式,则此左值: 表示该函数局部的自动变量,将在 return 自动变量不是函数参数 并且变量的类型与函数的返回类型相同 如果所有这些都成立,那么可以取消从左值的复制/移动: 更复杂的情况适合进行省略,但情况越复杂,编译器实际淘汰它的可能性就越小: 编译器仍然可以忽

  • 问题内容: 标头中包含以下行: 这实际上改变了我的python日志记录设置,但是pylint认为这是未使用的导入。我一般不希望删除警告,因此可以忽略这一行吗? 我不介意为此项目准备一个,因此更改配置文件的答案将被接受。 否则,这样的事情也会受到赞赏: 问题答案: Pylint消息控件记录在Pylint手册中: 是否可以在本地禁用特定消息? 是的,此功能已在Pylint 0.11中添加。这可以通过