C++ cli 为什么可以';跟踪引用不能用作类成员吗?

C++ cli 为什么可以';跟踪引用不能用作类成员吗?,c++-cli,tracking-reference,C++ Cli,Tracking Reference,以下代码: ref class A { private: int% referenceToAnInt; }; 在Visual Studio中生成以下错误: 错误C3160:“int%”:托管类的数据成员不能具有此类型 我认为跟踪引用是一件托管的事情——那么为什么它们不能成为托管类的成员呢? 另外:如何在C++/CLI中正确存储对值类型的引用?CLR不允许将跟踪引用存储为字段。另外,从C++/CLI规范: 包含具有存储持续时间的跟踪引用的程序 除了自动之外,其他的都是格式错误的。(这就排除了

以下代码:

ref class A
{
private:
  int% referenceToAnInt;
};
在Visual Studio中生成以下错误:

错误C3160:“int%”:托管类的数据成员不能具有此类型

我认为跟踪引用是一件托管的事情——那么为什么它们不能成为托管类的成员呢?
另外:如何在C++/CLI中正确存储对值类型的引用?

CLR不允许将跟踪引用存储为字段。另外,从C++/CLI规范:

包含具有存储持续时间的跟踪引用的程序 除了自动之外,其他的都是格式错误的。(这就排除了跟踪 作为数据成员引用。)

我猜他们是想避免这样的问题,即您将引用保留的时间长于被引用对象的实际生存期。另一种方法是使用wrapper ref类来保存值,或者使用委托进行读/写。

跟踪引用是“托管对象”,这就是为什么不能将它们用作类的成员。它们类似于C++ <代码>和<代码>引用,因为您可以使用它们引用其他方法中的局部变量。但是局部变量存储在短期存储中(也称为堆栈)。这意味着当包含该局部变量的方法结束时,引用将不再有效,但对象可能仍然存在


这不是内存安全的,这就是为什么在.Net中禁止这样做。

请尝试一次问一个问题。如果您有两个不同的问题,请在两篇文章中提问。C++/CLI不强制执行安全性,除非您使用
/clr:safe
开关生成可验证的输出。C++/CLI不强制执行安全性,但在本例中,clr强制执行安全性。