gpt4 book ai didi

c++ - 是否可以用 lambda 初始化变量(当复制 ctor 被删除时)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:57 26 4
gpt4 key购买 nike

我有以下代码:

struct A {//<-- Third party library class
A(){};
A(const A&) = delete;
void init(){};
int i;
};


int f(){
static A a = []{
A res;
res.init();
return res;
}();
return a.i;
}

现场观看:http://coliru.stacked-crooked.com/a/a5c5912bd79053c3

编译时出现如下错误:

g++ -std=c++17 -O2 -Wall -pedantic -pthread main.cpp && ./a.out

main.cpp: In lambda function:

main.cpp:12:12: error: use of deleted function 'A::A(const A&)'

return res;

^~~

main.cpp:4:3: note: declared here

A(const A&) = delete;

^

我知道我可以将其包装在另一个 struct 中并在该构造函数中初始化,但这似乎有点乏味。使用 ,我们是否有解决这个“问题”的“巧妙”方法?

任何解决方案都必须同样适用于函数中的静态变量

最佳答案

如果你的类是不可移动的,并且复制构造函数被删除/不可访问,那么你别无选择,只能返回对静态对象的引用,或者返回一个指针。这是因为 C++17 的 guaranteed copy elision仅适用于纯右值。由于对象在 lambda 中有名称,因此必须能够将其移动或复制到返回对象中,即使应用了 NRVO。

你可以使用

A& a = []() -> A& {
static A res;
res.init();
return res;
}();

auto a = []{
auto res = std::make_unique<A>();
res->init();
return res;
}();

关于c++ - 是否可以用 lambda 初始化变量(当复制 ctor 被删除时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55417273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com