gpt4 book ai didi

C++0x unique_ptr 误解?

转载 作者:太空狗 更新时间:2023-10-29 23:33:58 25 4
gpt4 key购买 nike

N2812简介中的一个示例,其中 unique_ptr作为值参数

给出
void push_back2(
std::list<std::unique_ptr<int>>& l, std::unique_ptr<int> a)
{
l.push_back(a); // oops: moves from the lvalue 'a', silently!
l.push_back(a); // oops: 'a' no longer has its original value
}

本文讨论了 RValue/LValue 重载解析的问题,但这不是我的观点。

我想知道,如果提供参数 std::unique_ptr<int> a by-value 不会导致编译器错误? 它会复制它,对吧?对于 unique_ptr,这是不允许

我知道这篇论文很旧,可能是 unique_ptr 的定义已经改变,因为。但也许这只是一个错字,作者想写 std::unique_ptr<int> &a相反?

我的 gcc 4.7.0 同意我的观点,但这不是证据:-)

void push_back2( std::list<std::unique_ptr<int>>&, std::unique_ptr<int> ) { };
int main() {
list<unique_ptr<int>> lst;
unique_ptr<int> num { new int{4} };
push_back2(lst, num); //ERR: use of deleted function
}

最佳答案

按值获取参数没有错。您是正确的,如果您尝试使用拷贝初始化参数,您将收到编译器错误,因为该函数已被删除。但是,您可以通过提供右值作为参数来初始化值参数。例如:

std::unique_ptr<int> myPtr{ /* ... */ }
std::list<std::unique_ptr<int>> elems;
push_back2(elems, myPtr); // Error, as you've noted
push_back2(elems, std::move(myPtr)); // Fine, uses move constructor to initialize

这种语法很好,因为它强制您明确指示您将指针移交给函数。

一旦你在 push_back2 里面,你是正确的 push_back 将无法接受 unique_ptr 因为它会尝试使用不存在的复制构造函数。要解决此问题,您需要再次使用 std::move:

void push_back2(
std::list<std::unique_ptr<int>>& l, std::unique_ptr<int> a)
{
l.push_back(std::move(a)); // Fine, moves a
l.push_back(std::move(a)); // Well that was dumb, but you asked for it!
}

我希望我正确地解释了你的问题,这就是你要找的...如果还有什么我可以尝试澄清的,请告诉我!

关于C++0x unique_ptr 误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7141220/

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