1

如果这是一个愚蠢的问题,请耐心等待,因为我最近开始学习 C++/CX。我正在阅读有关值类引用类的 MSDN 文档,并且遇到了以下例外情况:

因为值类或值结构的所有成员都是公共的并且被发送到元数据中,所以不允许使用标准 C++ 类型。

[A ref class] 可以包含 C++/CX 构造或标量类型作为成员,例如 enum 类、ref 类、float64 等。它还可能包含标准 C++ 类型。C++/CX 构造可能具有公共、受保护、内部、私有或受保护私有的可访问性。公共或受保护的成员被发送到元数据。标准 C++ 类型必须具有私有、内部或受保护的私有可访问性,以防止它们被发送到元数据。


我的问题是:“C++/CX 构造”和“标准 C++ 类型”的定义是什么?

如果我的猜测是正确的,C++/CX 构造包括 ref 类和结构以及枚举类和结构,标准 C++ 类型包括 int、bool、float、double 等。是吗?

4

1 回答 1

4

当文档说“C++/CX 构造”时,它表示 Windows 运行时类型。使用 C++/CX 编程时,有两类类型:

  1. C++ 类型:C++ 类型集包括您可以在普通 C++ 代码中使用的所有类型:基本类型(如intor double)、枚举、指针、引用、类类型等。

  2. Windows 运行时类型:这些类型可以跨 Windows 运行时 ABI 边界使用。其中包括引用类型 ( ref class)、Windows 运行时值类型(value class、数字类型、Windows 运行时枚举等)和委托。

请注意,这些类别之间有一些重叠:数字类型都在。

您可以在代码中的任何位置使用 C++ 类型,但您编写的任何公共组件的公共表面除外。只有 Windows 运行时类型可以跨 Windows 运行时 ABI 边界使用。例如:

public ref class C sealed 
{
public:

    // Ok:  int is a fundamental WinRT type
    void F(int x) { } 

    // Not ok:  std::string is not a WinRT type
    void G(std::string s) { } 

private:

    // Ok:  _s is private; private members are implementation details, so you
    // may use ordinary C++ types for private members.
    std::string _s; 
};

这两类类型并不是在 C++ 中构建 Windows 运行时组件所独有的:如果您在 .NET 中构建组件,则可以使用 .NET 特定类型(例如,具体泛型类型)和 .NET 特定构造(例如,泛型方法) ),它们不是有效的 Windows 运行时类型。

于 2012-09-21T00:14:05.937 回答