1

在查看 marshal_as 函数调用之一需要以下格式:

System::String^ const &

const &托管指针之后的目的是什么?

这不适合我:

static std::wstring GetString(const System::String^ value)
{
    return msclr::interop::marshal_as<std::wstring>(value);
}

错误 1 ​​错误 C4996:

'msclr::interop::error_reporting_helper<_To_Type,_From_Type>::marshal_as':库不支持此转换或不包含此转换所需的头文件。请参阅有关“如何:扩展编组库”的文档以添加您自己的编组方法。c:\程序文件 (x86)\microsoft visual studio 9.0\vc\include\msclr\marshal.h 203

这样做:

static std::wstring GetString(const System::String^ value)
{
    return msclr::interop::marshal_as<std::wstring>(const_cast<System::String^>(value));
}
4

1 回答 1

3

marshal_as 方法由此模板定义:

template <class _To_Type, class _From_Type>
inline _To_Type marshal_as(const _From_Type&);

extra 的主要目的const &是符合这个模板声明。

这确实会影响函数的调用方式:我检查了 IL,并且String^正如人们所期望的那样,它作为 const 间接引用传递,但这并不是一个重大变化。

如果该方法是独立的,则可能会在没有 的情况下声明它const &,并且几乎没有区别。


您正在尝试String^ const &使用String^ const. 编译器无法自动(安全地)进行该转换。

您对 const_cast 所做的就是String^ constString^. 编译器可以安全、自动地String^转入。String^ const &

我只是const从你的本地方法声明中删除。这为我编译:

static std::wstring GetString(System::String^ value)
{
    return msclr::interop::marshal_as<std::wstring>(value);
}

为什么编译器不能进行这种转换?请注意,String^ const &const String^ const &不是一回事。第一个说“指向字符串对象的常量指针”。第二个说“指向常量字符串对象的常量指针”。在你的方法中(const System::String^ value),你有一个常量字符串对象,你调用的函数需要一个指向非常量字符串对象的指针。我们知道 String 类是不可变的,但编译器不可变,因此它不会将 const 对象的地址传递给认为该对象是非常量的方法。

(我使用的是 Visual Studio 2010 SP1,但我不相信编组方法在 2008 年和 2010 年之间有任何重大变化。)

于 2013-01-31T16:06:19.833 回答