gpt4 book ai didi

c++ - MSVC 将仅移动结构参数解释为指针

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:45 26 4
gpt4 key购买 nike

我有一个简单的单成员结构,其中删除了复制构造/赋值,以及默认移动构造/赋值。我正在尝试按值将这些结构之一传递给函数并返回成员 - 非常简单。

struct NoCopy {
explicit NoCopy(int x) : x{x} {}

NoCopy(const NoCopy&) = delete;
NoCopy& operator=(const NoCopy&) = delete;

NoCopy(NoCopy&&) = default;
NoCopy& operator=(NoCopy&&) = default;

int x;
};

// noinline to ensure the crash is reproducible in release
// not required to reproduce the problem code
__declspec(noinline) int problem_function(NoCopy x) {
return x.x;
}

int main() {
return problem_function(NoCopy{ 1 });
}

问题是当用 MSVC 编译时,这个函数崩溃了。

查看反汇编,似乎在删除复制构造函数时,MSVC 尝试将 x 解释为 NoCopy* 并且后续成员读取导致段错误。

这是一个 godbolt 示例,带有 gcc 和 clang 以供引用:https://godbolt.org/z/jG7kIw

请注意,gcc 和 clang 的行为都符合预期。另请注意,这在优化和未优化的构建中都会发生,并且似乎会影响 MSVC 2015 和 2017。

作为引用,我在我的机器上使用 Visual Studio Professional 2015(14.0.25431.01 更新 3)进行编译 - 我主要测试 x64 构建。我的崩溃重现平台工具集设置为 v140。

所以我的问题是:对此有任何合理的解释,还是我正在查看编译器错误。

编辑:我已经提交了错误报告 over here

编辑#2:如果像我一样,你遇到了类似的问题并且无法轻松更新 VS - 似乎定义移动构造函数/赋值运算符手动而不是使用 = default 导致 MSVC 在调用站点吐出正确的代码并避免崩溃。 here's a new godbolt

因此,像 std::unique_ptr 这样的东西似乎没有受到影响。结构大小似乎也是一个因素。

最佳答案

除了严重的编译器错误,我看不出这是什么。代码有效。

在两个 MSVS 版本中已经破坏了如此基础的东西,这似乎确实很奇怪,但如果我不得不猜测这可能是由于相对较新的 C++17 复制省略支持。 (当然,在这种情况下,我使用的术语“支持”有点松散。)

(在线提出 OP 的 VS 错误 here .)

关于c++ - MSVC 将仅移动结构参数解释为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53104022/

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