use*_*202 63 c++ unique-ptr c++11
我怎样才能将std::unique_ptr函数传递给函数?可以说我有以下课程:
class A
{
public:
A(int val)
{
_val = val;
}
int GetVal() { return _val; }
private:
int _val;
};
Run Code Online (Sandbox Code Playgroud)
以下内容无法编译:
void MyFunc(unique_ptr<A> arg)
{
cout << arg->GetVal() << endl;
}
int main(int argc, char* argv[])
{
unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
MyFunc(ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能传入std::unique_ptr函数?当然这是构造的主要目的吗?或者C++委员会是否打算让我回到原始的C风格指针并将其传递给它:
MyFunc(&(*ptr));
Run Code Online (Sandbox Code Playgroud)
最奇怪的是,为什么这是一种传递它的好方法?看起来非常不一致:
MyFunc(unique_ptr<A>(new A(1234)));
Run Code Online (Sandbox Code Playgroud)
Bil*_*nch 92
这里基本上有两种选择:
void MyFunc(unique_ptr<A> & arg)
{
cout << arg->GetVal() << endl;
}
int main(int argc, char* argv[])
{
unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
MyFunc(ptr);
}
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,断言将成立!
void MyFunc(unique_ptr<A> arg)
{
cout << arg->GetVal() << endl;
}
int main(int argc, char* argv[])
{
unique_ptr<A> ptr = unique_ptr<A>(new A(1234));
MyFunc(move(ptr));
assert(ptr == nullptr)
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*nen 22
你按价值传递它,这意味着制作副本.这不是很独特,不是吗?
您可以移动该值,但这意味着将对象的所有权和对其生命周期的控制权交给该函数.
如果在MyFunc调用的生命周期内保证对象的生命周期存在,则只需传递一个原始指针ptr.get().
R S*_*ahu 15
为什么我不能传入
unique_ptr函数?
你不能这样做因为unique_ptr有一个移动构造函数而不是一个复制构造函数.根据标准,当定义移动构造函数但未定义复制构造函数时,将删除复制构造函数.
12.8复制和移动类对象
...
7如果类定义未显式声明复制构造函数,则会隐式声明一个.如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除;
您可以使用以下命令传递unique_ptr给函数:
void MyFunc(std::unique_ptr<A>& arg)
{
cout << arg->GetVal() << endl;
}
Run Code Online (Sandbox Code Playgroud)
并像你一样使用它:
要么
void MyFunc(std::unique_ptr<A> arg)
{
cout << arg->GetVal() << endl;
}
Run Code Online (Sandbox Code Playgroud)
并使用它像:
std::unique_ptr<A> ptr = std::unique_ptr<A>(new A(1234));
MyFunc(std::move(ptr));
Run Code Online (Sandbox Code Playgroud)
重要的提示
请注意,如果使用第二种方法,ptr则在调用std::move(ptr)返回后没有指针的所有权.
void MyFunc(std::unique_ptr<A>&& arg)会有同样的效果,void MyFunc(std::unique_ptr<A>& arg)因为两者都是引用.
在第一种情况下,ptr调用后仍然拥有指针的所有权MyFunc.
为什么我不能将 a 传递
unique_ptr给函数?
您可以,但不能通过复制 - 因为std::unique_ptr<>不可复制构造。
这肯定是构造的主要目的吗?
除其他外,std::unique_ptr<>旨在明确标记 唯一所有权(与 相对std::shared_ptr<>)。
最奇怪的是,为什么这是通过它的好方法?
因为在那种情况下,没有复制构造。
由于MyFunc不拥有所有权,最好拥有:
void MyFunc(const A* arg)
{
assert(arg != nullptr); // or throw ?
cout << arg->GetVal() << endl;
}
Run Code Online (Sandbox Code Playgroud)
或更好
void MyFunc(const A& arg)
{
cout << arg.GetVal() << endl;
}
Run Code Online (Sandbox Code Playgroud)
如果你真的想拥有所有权,你必须移动你的资源:
std::unique_ptr<A> ptr = std::make_unique<A>(1234);
MyFunc(std::move(ptr));
Run Code Online (Sandbox Code Playgroud)
或直接传递 r 值引用:
MyFunc(std::make_unique<A>(1234));
Run Code Online (Sandbox Code Playgroud)
std::unique_ptr 没有故意复制以保证只有一个所有者。