错误 C2102:“&”需要左值,VS2019。怎么修?

Mik*_*ola 5 c++ directx

我正在使用 DirectX 11 并尝试使用 XMLoadFloat4 在范围内本地加载变量。我做了很多工作,而且名称很长,所以我不想创建一堆局部变量,但是使用如下代码:

XMStoreFloat4(&vertices[0].normal, XMVector3Cross(
        XMLoadFloat4(&(vertices[2].position - vertices[0].position)),
        XMLoadFloat4(&(vertices[0].position - vertices[1].position))
        ));
Run Code Online (Sandbox Code Playgroud)

我收到了 C2102。您知道像这样在适当的地方创建参考的优雅方法吗?

小智 8

您现在可以通过在 C/C++ -> 语言项目设置中将“一致性模式”更改为“否”来禁用 /permissive- 来解决此问题。


Ted*_*gmo 3

您知道像这样在适当的地方创建参考的优雅方法吗?

该函数需要指针,而您试图传递不允许的临时地址。只需将临时结果存储在变量中并将地址传递给这些变量:

auto a = vertices[2].position - vertices[0].position;
auto b = vertices[0].position - vertices[1].position;

XMStoreFloat4(
    &vertices[0].normal,
    XMVector3Cross(
        XMLoadFloat4(&a),
        XMLoadFloat4(&b)
    )
);
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,``C2102`` 是使用``/permissive-`` 时针对 Visual C++ (16.8) 的新 C++ 一致性警告。它值得修复,因为它在技术上不符合(例如 clang/LLVM 会发出 -Waddress-of-temporary),但如果你不关心,你可以关闭“/permissive-”。 (3认同)
  • @ChuckWalbourn哦,我从来没有尝试过传递临时地址,因为不符合要求。使用 `const&` 来延长临时变量的生命周期非常常见,但我以前从未见过这个版本。 (2认同)