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

容器中的引用?

卫子平
2023-03-14
#include <iostream>
#include <string>

struct Foo {
  void init(int num, const std::string& txt)
  {
    this->num = num;
    this->txt = txt;
  }

  int num;
  std::string txt;
};

int main()
{
  auto codegen1 = [](std::pair<int, const std::string&> package) -> Foo* {
    auto foo = new Foo;
    foo->init(package.first, package.second); //here string goes out of scope, exception
    return foo;
  };

  auto codegen2 = [](int num, const std::string& txt) -> Foo* {
    auto foo = new Foo;
    foo->init(num, txt);
    return foo;
  };

  auto foo = codegen1({3, "text"});
  auto foo2 = codegen2(3, "text");
  std::cout << foo->txt;
} 

我知道应该使用常量std::pair & ,但我想知道为什么这种方法不起作用。

共有1个答案

魏健柏
2023-03-14

第1部分:这看起来一看就坏了。

“text”不是字符串,而是用于创建临时std::string对象的文本,然后该对象用于初始化std::pair。因此,您会认为,在引用该字符串时,只暂时需要该字符串(即在构造std::pair之前)是有意义的。

第二部分:但它不应该被打破。

那么,为什么在codegen1()的情况下字符串会过早地被销毁呢?从“text”std::string的转换不是作为子表达式发生的,而是作为一个单独的函数的一部分,该函数使用自己的作用域进行调用。

这里使用的std::pair的构造函数是:

// Initializes first with std::forward<U1>(x) and second with std::forward<U2>(y).
template< class U1 = T1, class U2 = T2 >
constexpr pair( U1&& x, U2&& y );

构造函数获取“text”作为参数,并且std::string的构造是在std::pair的构造函数中进行的,因此当我们从该构造函数返回时,作为该过程的一部分创建的临时变量将被清除。

我们怎么解决这个问题?

有几个选择:

强制转换在正确的“级别”发生:

auto foo = codegen1({3, std::string("text")});
using namespace std::literals::string_literals;
auto foo = codegen1({3, "text"s});
auto codegen1 = [](std::pair<int, std::string_view> package) -> Foo* {
...
}
struct Foo {
  Foo(int num, std::string txt)
    : num(num)
    , txt(std::move(txt))
  {}

  int num;
  std::string txt;
};

int main()
{
  auto codegen1 = [](std::pair<int, std::string> package) {
    return std::make_unique<Foo>(package.first, std::move(package.second));
  };

  auto foo = codegen1({3, "text"});

  std::cout << foo->txt;
}
 类似资料:
  • 我正试着对齐下面的下拉列表,但是不能让它工作。此外,我还有一个图层的问题,不幸的是下拉列表显示在下面的容器下。有人能帮帮我吗?有人有主意吗? null null

  • > 我正试图弄清楚Kubernetes中的网络,尤其是多集装箱吊舱的处理。在我的简单场景中,我总共有3个豆荚。其中一个有两个容器,另一个只有一个容器,它希望与多容器吊舱中的特定容器通信。我想弄清楚kubernetes如何处理此类容器之间的通信。 为此,我在一个“sidecar体系结构”中有一个简单的多容器吊舱,YAML文件如下所示: > 我想用这个YAML文件实现的是,在pod“nginx”中,有

  • 给定以下代码,ReSharper会给出错误 null

  • 在独立AEM安装中,felix OSGi容器是否存在于jetty servlet容器中?或者Jetty服务器是作为捆绑包安装在Felix OSGi容器中的? AEM启动时,哪一个将首先启动? 对于基于战争的安装,这将如何改变? 根据这个答案,两者都是可能的。但我想知道AEM采用哪种方法。

  • 我使用的是win8,以前我一直在我的pc上运行Eclipse Juno,但从现在起我想开始使用STS,当我创建一个新项目时,我会得到以下错误。我删除了我的.m2文件夹,并且所有与Eclipse相关的东西都是为了从头开始,但是仍然没有效果,我的想法已经用完了。有什么建议吗??? 找不到“springframework.org/tags”index.JSP/app/src/main/webapp第6行

  • 我不明白自己的道具在文档中是如何工作的,请帮我澄清以下内容: > 如果我有3个组件-1。todoList、todo和connectedTodo(,todolist会呈现大量connectedTodo并向其传递道具,这是否意味着todo将有权访问从todolist传递的道具?如果我没有指定ownProps,则todo将无法访问传递给connectedTodo的道具? 每当组件收到新道具时,MapSt