gpt4 book ai didi

c++-cli - C++/CLI, "constant"对跟踪句柄的引用

转载 作者:行者123 更新时间:2023-12-01 07:22:18 24 4
gpt4 key购买 nike

我在代码中发现了这样的事情:

void foo(IList<int>^ const & list ) { ... }

这是什么 ^ const&意思?我查看了 C++/CLI 规范,但没有发现关于持续跟踪引用的评论,也没有发现 ^&组合。

这是合法的吗?

最佳答案

这段代码可能是由一个 C++ 程序员编写的,他使用通用的 C++ 惯用语来编写 C++/CLI。这是非常错误的,只有当句柄存储在堆栈中时,才能传递对跟踪句柄的引用。如果传递的 List<> 引用存储在堆上对象的字段中,则它无法工作,垃圾收集器可以移动它并使指针无效。编译器将捕获它并生成错误。 ^ 已经是一个引用,不需要额外的引用。

如果没有引用,const 关键字也不再有意义。不是它以前做过,CLR 不能强制执行它。并不是说这在这里很重要,无法从任何其他 .NET 语言调用此代码。它们不会生成指向跟踪句柄的指针。

只需修复它,保留这样的坏代码没什么意义:

 void foo(IList<int>^ list ) { ... }

显示引用无法工作的代码示例:
using namespace System;
using namespace System::Collections::Generic;

ref class Test {
public:
IList<int>^ lst;
void foo(IList<int> const &list) {}
void wontcompile() {
foo(lst); // C3699
IList<int>^ okay;
foo(okay);
}
};

关于c++-cli - C++/CLI, "constant"对跟踪句柄的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com