gpt4 book ai didi

c++ - 如何防止在 for_each 的末尾调用复制构造函数?

转载 作者:太空狗 更新时间:2023-10-29 23:51:17 26 4
gpt4 key购买 nike

在下面的代码中,我希望看到 COD,但实际输出是 CODD。我最终确定存在对复制构造函数的隐藏调用,因此输出现在是 COUDD

虽然我发现了额外的析构函数调用的原因,但我不明白为什么会生成它,这使我无法修复它。我认为它必须来自返回一元函数的 for_each 但由于我没有按值传递或返回(或者我不认为我是),因此不应调用复制构造函数。一切都应以引用为准。我可以使用指针,但由于 test_enc 对象在调用 for_each 期间应该是作用域,因此引用更好。

struct test_enc
{
test_enc(std::string& ref) : ref_(ref) {
ref_.push_back('C');
}
test_enc(const test_enc& other) : ref_(other.ref_) {
ref_.push_back('U');
}
~test_enc() {
ref_.push_back('D');
}
void operator()(const char byte) {
ref_.push_back('O');
}
test_enc& operator=(const test_enc&) = delete;
std::string& ref_;
};

TEST(CheckTestEncoderEncodesExactlyOneByte)
{
const std::string unencoded_string("M");
std::string encoded_string;
std::for_each(unencoded_string.begin(), unencoded_string.end(), test_enc(encoded_string));
CHECK_EQUAL(3U, encoded_string.size());
CHECK_EQUAL("COD", encoded_string); // get "COUDD"
}

如何在没有不需要的复制构造函数的情况下调用 test_enc?

最佳答案

std::for_each按值获取其一元仿函数。所以你无法避免复制,但你可以通过使用 std::reference_wrapper 来模拟引用语义。 :

#include <functional>

std::string encoded_string;
test_encoded test_str(encoded_string);
std::for_each(unencoded_string.begin(),
unencoded_string.end(),
std::ref(test_str));

关于c++ - 如何防止在 for_each 的末尾调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22426993/

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