以下隐藏 unique_ptr 丑陋的“技巧”有什么问题?
class Drawable;
typedef unique_ptr<Drawable> pDrawable;
#define newDrawable(...) pDrawable(new Drawable (##__VA_ARGS__))
前两个很好。但是第三个在VS2012中导致错误:
23 IntelliSense: "std::unique_ptr<_Ty, _Dx>::unique_ptr(const std::unique_ptr<_Ty, _Dx>::
_Myt &) [with _Ty=Drawable, _Dx=std::default_delete<Drawable>]" (declared at line 1447 of
"C:\vs2012\VC\include\memory") is inaccessible file.h 36 26
我不明白为什么这不起作用,除非我误解了 C++ 定义宏的工作方式。我认为它会简单地替换这段代码:
newDrawable(a, b, c)
和
unique_ptr<Drawable>(new Drawable(a, b, c));
我知道 unique_ptr 不能被复制,但我不是在复制它,在这里。我是吗?
编辑:
我收到了一些关于“使用”相关宏的请求:
如果我要使用它,它将按如下方式使用:
pDrawable myDraw = newDrawable();
我想翻译成:
unique_ptr<Drawable> myDraw = unique_ptr<Drawable>(new Drawable());
但是,如果没有 Visual Studio 给出以下错误,我什至无法编译宏。就好像#define 中的某些内容本身是不允许的。错误在我进行定义的那一行返回,而不是在我调用定义的那一行。
请参阅此处了解为什么 make_unique 不起作用:make_unique 不编译
编辑2
我已经回答了下面的问题。上面的代码确实可以编译和工作。