#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部分:这看起来一看就坏了。
“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