如何使std :: make_unique成为我班上的朋友 [英] How to make std::make_unique a friend of my class
问题描述
我想声明std::make_unique
函数作为我班上的朋友.原因是我想声明构造函数protected
并提供使用unique_ptr
创建对象的替代方法.这是示例代码:
I want to declare std::make_unique
function as a friend of my class. The reason is that I want to declare my constructor protected
and provide an alternative method of creating the object using unique_ptr
. Here is a sample code:
#include <memory>
template <typename T>
class A
{
public:
// Somehow I want to declare make_unique as a friend
friend std::unique_ptr<A<T>> std::make_unique<A<T>>();
static std::unique_ptr<A> CreateA(T x)
{
//return std::unique_ptr<A>(new A(x)); // works
return std::make_unique<A>(x); // doesn't work
}
protected:
A(T x) { (void)x; }
};
int main()
{
std::unique_ptr<A<int>> a = A<int>::CreateA(5);
(void)a;
return 0;
}
现在我收到此错误:
Start
In file included from prog.cc:1:
/usr/local/libcxx-head/include/c++/v1/memory:3152:32: error: calling a protected constructor of class 'A<int>'
return unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
^
prog.cc:13:21: note: in instantiation of function template specialization 'std::__1::make_unique<A<int>, int &>' requested here
return std::make_unique<A>(x); // doesn't work
^
prog.cc:22:41: note: in instantiation of member function 'A<int>::CreateA' requested here
std::unique_ptr<A<int>> a = A<int>::CreateA(5);
^
prog.cc:17:5: note: declared protected here
A(T x) { (void)x; }
^
1 error generated.
1
Finish
将std::make_unique
声明为班级朋友的正确方法是什么?
What is the correct way to declare std::make_unique
as a friend of my class?
推荐答案
make_unique
Perfect向您传递您传递给它的论点;在您的示例中,您正在向函数传递左值(x
),因此它将推导参数类型为int&
.您的friend
函数声明必须为
make_unique
perfect forwards the arguments you pass to it; in your example you're passing an lvalue (x
) to the function, so it'll deduce the argument type as int&
. Your friend
function declaration needs to be
friend std::unique_ptr<A> std::make_unique<A>(T&);
类似地,如果要在CreateA
中使用move(x)
,则friend
声明必须为
Similarly, if you were to move(x)
within CreateA
, the friend
declaration would need to be
friend std::unique_ptr<A> std::make_unique<A>(T&&);
这将使代码编译,但绝不能保证它将在因为据您所知,make_unique
会将其参数转发到实际实例化您的类的另一个内部帮助器函数,在这种情况下,该帮助器将需要为friend
.
This will get the code to compile, but is in no way a guarantee that it'll compile on another implementation because for all you know, make_unique
forwards its arguments to another internal helper function that actually instantiates your class, in which case the helper would need to be a friend
.
这篇关于如何使std :: make_unique成为我班上的朋友的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!