0

在我们的项目中,我们有一个在 C# 中定义的 3 维向量 (x,y,z) 的只读结构,如下所示:

public readonly struct Vec3
{
   public readonly double X, Y, Z;
   ...
}

我们想在 C++/CLI 代码中调用以下内容:

auto myVector = Vec3(1, 2, 3);
coordinates.push_back(myVector.X); //"coordinates" is a std::vector<double>

但是这样做会导致以下错误:

C3893:只允许在类 ....Vec3 的实例构造函数中使用 initonly 数据成员的左值。

我们相当肯定这是因为 push_back() 方法具有以下签名:

void push_back(const _Ty& _Val)

但是我们还没有弄清楚如何将只读字段传递给 push_back。我们尝试了各种演员表,到目前为止唯一有效的是执行以下操作:

double x = vert.X;
coords.push_back(x);

关于如何“正确”做到这一点的任何想法?谢谢您的帮助!

4

1 回答 1

1

我将在上面重新发布 Hans 的评论并将其标记为答案,以便清楚地显示如下:

Hans Passant 说:“这个语句有两个问题,不幸的是编译器选择了一个更难理解的。使用

double copy = myVector.X;
coords.push_back(copy);

以确保编译器知道垃圾回收不能使 double& 无效。好吧,你已经发现了,这是正确的解决方法。”

于 2021-11-05T13:30:52.447 回答