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

如果块调用函数时如何使用复制省略

公羊瀚
2023-03-14

在下面的代码段中,由于复制选择,a不会发生移动和复制

struct A;
A function1();
A function2();

int main(int argc, char**) {
  if (argc > 3) {
    A a = function1();
  } else {
    A a = function2();
  }
  return 0;
}

这很好,但是a在if-block之外是不可访问的。 在外部声明a时,将发生移动

struct A;
A function1();
A function2();

int main(int argc, char**) {
  A a;
  if (argc > 3) {
    a = function1();
  } else {
    a = function2();
  }
  return 0;
}

当在调用站点上的if块中复制删除到if范围之外的变量时,从复制删除中获利的推荐方式是什么?

编译器-Exlorer链接

共有2个答案

鱼意远
2023-03-14

通常,您必须使用placement new来执行以下操作:

template<class T>
struct box {
  char buf[sizeof(T)];  // real code should handle alignment
  T *p{};  // will point to buf
  void reset() {
    if(p) p->~T();
    p=nullptr;
  }
  ~box() {reset();}
};

void f() {
  box<A> a;
  if(…) a.p=new (a.buf) A(function1());
  else a.p=new (a.buf) A(function2());
  // use *a.p
}

这允许围绕初始化的任意语句,以及重复使用单个变量等。

box只是std::optional的一个重新实现,具有允许直接new的勇气; 当然,将它包装在一个函数中会为从任何函数返回的a实现一个临时值。 box::p避免了必须使用std::launder来处理生存期问题。

端木令
2023-03-14

在这种特殊情况下,您可以使用三元条件:

A a = argc>3 ? function1() : function2();

在更复杂的情况下,您可能需要保存条件并进行几项检查,例如。

const bool cond = argc>3;
A a = cond ? function1() : function2();
A b = cond ? function3() : function4();
 类似资料:
  • 我有以下代码: 我要复制的类: 创建一些类 公共对象createObj(String cls\u name,String param1,int param2){返回Class.forName(cls\u name)。getConstructor(String.Class,Integer.Class)。newInstance(param1,param2);} 然后我尝试使用以下内容复制该类的对象:

  • 问题内容: HTML: 脚本: 请告诉我在调用方法时如何使用模板值? 问题答案: 从指令调用函数时,传递范围变量值而不插入值()。

  • 问题内容: 我有点着急,所以我只想问一个关于querydsl的快速问题。根据我的研究,查询dsl不支持存储过程,但可以支持数据库功能。我的问题是我们如何使用querydsl调用那些数据库函数? 问题答案: 您可以在查询中使用基于TemplateExpression的任意JPQL语法注入。 例如 如果您使用的是Hibernate 4.3或任何其他符合JPA 2.1的提供程序,则可以使用FUNCTIO

  • 我想知道是否有办法在python代码中使用c函数 例如,在做了我的研究之后,我确实使用. dll文件找到了这个解决方案。但它找不到功能我的代码: 享乐cpp: 使用cmd编译它: g有趣。cpp-o乐趣。动态链接库 使用Python调用函数,ctype: 但是我有这个错误: 回溯(最后一次调用):文件“c:\Users\User.vscode\extensions\ms python.python

  • 这是python游戏的基本战利品表。 常见的,如果滴滚动到任何数字,包括13 不寻常,如果下降滚动14通过,并在18 如果跌落在19或20滚动 即使在满足条件的情况下,该程序也会忽略罕见掉落表,而是从罕见掉落表中取出一个项目,例如掉落=20 1000金币 有人能解释一下这里的问题吗?

  • 问题内容: 在我的angularJS应用程序中,我有两个模块:模块A和模块B。 如何在模块B中调用该函数? 问题答案: 您需要在 模块A中 定义一个工厂: 然后使用 模块B中* 的工厂: *

  • 问题内容: 我有一个名为myfunctions.php的文件,其中有很多功能,例如 和jQuery代码, 我需要在此文件中调用特定的函数;例如。我怎样才能做到这一点? 问题答案: 在PHP中 在AJAX中

  • 在node的上下文中,我无法理解ES6模块。js。 假设我有一个简单的节点应用程序。它基于iisnode示例,但我在顶部添加了一个。 你好js: 这将导致在模块之外使用导入语句 但是如果我改名为hello。你好。mjs我收到以下错误: 对我来说似乎是个陷阱,有什么出路? (iisnode版本为0.2.26,节点版本为v13.8.0)