gpt4 book ai didi

c++ - 如何使用std::function复制 “partially”对象?

转载 作者:行者123 更新时间:2023-12-01 14:43:06 25 4
gpt4 key购买 nike

这是我的code:

#include <iostream>
#include <functional>

struct Test {
struct Envelope {
const int x = 1;
int y = 2;
int z = 3;
};

Envelope mEnvelope;

struct Buffer {
Envelope mEnvelope;
} mBuffer;
std::function<Buffer()> func{[this] {
mBuffer.mEnvelope = mEnvelope;

return mBuffer;
}};
};

int main() {
Test test;
}

它说:
g++ -std=c++17 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In lambda function:
main.cpp:17:29: error: use of deleted function 'Test::Envelope& Test::Envelope::operator=(const Test::Envelope&)'
17 | mBuffer.mEnvelope = mEnvelope;
| ^~~~~~~~~
main.cpp:5:12: note: 'Test::Envelope& Test::Envelope::operator=(const Test::Envelope&)' is implicitly deleted because the default definition would be ill-formed:
5 | struct Envelope {
| ^~~~~~~~
main.cpp:5:12: error: non-static const member 'const int Test::Envelope::x', can't use default assignment operator

我试过使用复制构造函数:
Envelope(const Envelope &other) {
y = other.y;
}

或覆盖运算符 =
Envelope &operator=(Envelope &other) {
// self-assignment guard
if (this == &other) {
return *this;
}

y = other.y;
}

但是错误越来越严重。

我只需要复制对象的某些“部分”。
这只是一个测试,当然,实际对象有很多成员字段,有些需要忽略。

如何在 std::function<Buffer()>中完成呢?

最佳答案

好的,因为问题可能不明显,所以:

  • 复制分配运算符通常应具有const&参数,而不是&参数。
  • 然后,您还应该提供显示的Envelope的副本构造函数。首先,它的行为与隐式生成的行为不同(隐式生成的行为将复制所有元素,而不仅仅是y),并且自C++起不赞成使用用户定义的副本分配时隐式副本构造函数的生成。 11,可能会在将来的标准迭代中删除。
  • 然后,由于您现在拥有用户定义的构造函数,因此您还需要默认默认构造函数:
    Envelope() = default;
  • 此外,声明了您的副本分配运算符以返回Envelope&(应如此),但是您实际上忘记在其末尾添加return语句,因此执行它会导致未定义的行为,如下所示:
    return *this;
  • 关于c++ - 如何使用std::function复制 “partially”对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61104022/

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