C++ auto foo=ref new foo();“什么是”呢;参考号;?

C++ auto foo=ref new foo();“什么是”呢;参考号;?,c++,windows-runtime,c++-cx,C++,Windows Runtime,C++ Cx,我正在观看来自//build/的视频,一些MS开发人员在他们的C++11程序中使用了如下语法: auto foo = ref new Foo(); 我理解这行中除“ref”之外的所有内容。这意味着什么?< /P> < P>即将到来的VisualC++编译器添加了这个语法来处理WiRT对象(这是下一代COM,我们现在经历了什么?COM、DCOM、COM+、ActiveX、…)< /P> 这条线几乎相当于: com_ptr_t<Foo> foo = CreateInstance<

我正在观看来自//build/的视频,一些MS开发人员在他们的C++11程序中使用了如下语法:

auto foo = ref new Foo();

我理解这行中除“ref”之外的所有内容。这意味着什么?< /P> < P>即将到来的VisualC++编译器添加了这个语法来处理WiRT对象(这是下一代COM,我们现在经历了什么?COM、DCOM、COM+、ActiveX、…)< /P> 这条线几乎相当于:

com_ptr_t<Foo> foo = CreateInstance<Foo>();
com_ptr_t foo=CreateInstance();
但是还有一个新版本的
com\u ptr\t
,使用语法
Foo^
“ref new”是一个2令牌关键字。它指示编译器实例化windows运行时对象并自动管理对象的生存期(通过“^”操作符)


实例化windows运行时对象会导致分配,但它不必位于堆上。

ref在本例中代表引用计数。使用ref的类是WinRT组件,它具有现成的引用计数机制。

这让我觉得有点激进的语法滥用。我不知道WinRT,但是这是否在C++(原生)堆上创建了一个动态实例?@ KeRekSB:非常肯定它使用了一个OS分配器,像COM对象传统上所做的(但与其他所有的一样,我确信有一个新的改进的WrRT分配器而不是)。因此,它是堆上的动态实例,而不是由C++运行库管理的堆,用于<代码>新< /COD>和<代码>删除< /代码>。@我不知道知道这个设计决定的具体原因,但是在ATL写C++和COM代码几年后马上想到的一件事是,实现为模板类的智能指针不能很好地使用不使用它们的API——最终不得不在API边界上显式地包装/拆开原始指针到智能指针。一个特别糟糕的情况是,指针是一个out参数,所以在包装它之前必须为它提供一个原始指针变量,或者像ATL一样重载一元
&
,并破坏STL。@PavelMinaev:重载
运算符&
不再违反STL约束。其次,设计为使用新东西编写的API只需要
com\u ptr\t
。然而,萨特说,他们几乎只在C++中制作了它的库,但也有一些奇怪的边缘情况,它们作为一个库产生了非常糟糕的性能,它们不得不用语言来解决它们。语法增强本身已经存在于C++/CLI编译器中。@DeadMG:您是否有指向Herb Sutter的详细信息的链接?引用是双模式值/引用吗?当引用超出范围时,是否将其视为CComPtr?ref类可以像普通类一样在堆栈上实例化吗?WinRT/C++/CX是否支持旧的基于COM的代码(接口以及基于ATL的实现)?很抱歉出现了这么多问题…这些不是参考资料-“ref new”是一个语言关键字,就像“new”和“\uu gcnew”一样。因此,不能在堆栈上实例化它们(可以在堆栈上实例化指针吗?)。WinRT是一组API和一组API模式,所以说它支持基于COM的代码是毫无意义的。C++/CX支持经典COM API,就像C++/CLI支持经典COM API一样。您可以在C++/CX应用程序中使用ATL,也可以使用新的WRL模板库(ComPTR)。在任何示例中,我都没有看到对Release()的任何显式调用,因此我猜编译器在句柄/指针/引用(无论在CX中调用什么)超出范围时会注入对Release()的调用。这是一个正确的猜测吗?这是正确的-这就是我在msdn上读到的“自动管理对象的生命周期”的意思,^引用包含两个指针,一个指向对象,一个指向类定义,它们的创建-删除行为与C++11共享\u ptr的行为相同。我的假设是指向类定义的指针,因为WinRT对象很容易传递给其他WinRT语言(C#和JavaScript)的包。()这样就没有人会有错误的想法:这不是C++11语法!这是一个Microsoft扩展。你应该在14:30查看这段视频“从C++使用Windows运行时”