【发布时间】:2013-02-07 00:27:54
【问题描述】:
以下隐藏 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 does not compile
edit2
我已经回答了下面的问题。上面的代码确实可以编译,并且可以工作。
【问题讨论】:
-
你如何在完整的语句中实际使用
newDrawable()? -
你不写自己的
make_unique?因为真诚地,这个宏方式更丑:/ -
我怀疑您使用它来代替
make_unique,因为这是与make_shared类似的用例。 Herb Sutter 有一个 make_unique here 的实现示例。 -
如果他们记得将它包含在标准中,这就是 make_unique 的用途。
-
请展示一个完整的例子来说明问题。
标签: c++ visual-c++ c++11 visual-studio-2012