Visual Studio MSVC:静态结构标准::原子< bool>测试::g_test具有不同的类型

anhgbhbe  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(118)

我的Visual Studio 17(2022)项目出现了以下警告,我可以将其简化为以下内容:

测试1.cpp

#include <atomic>
#include "test.h"

int main() {
    Test::g_test = true;
}

测试2.cpp

#include <atomic>

struct A {
    std::atomic<bool> m_test = false;
};

#include "test.h"

void a() {
    Test::g_test = true;
}

测试. h

#pragma once

struct Test {
    static inline std::atomic<bool> g_test = false;
};

结果:

1>------ Build started: Project: ConsoleApplication1, Configuration: Release x64 ------
1>test1.cpp
1>test2.cpp
1>LINK : warning C4744: 'static struct std::atomic<bool> Test::g_test' has different type in 'c:\consoleapplication1\test2.cpp' and 'c:\consoleapplication1\test1.cpp': '__declspec(align(1)) struct (1 bytes)' and 'struct (1 bytes)'

我是否违反了一些C++规则?是否是MSVC错误?最好的修复/解决方法是什么?

fhg3lkii

fhg3lkii1#

这是一个编译器错误。请参阅https://github.com/microsoft/STL/issues/3241https://developercommunity.visualstudio.com/t/10207002
从STL错误报告https://github.com/microsoft/STL/issues/3241简化,这似乎实际上是一个编译器问题。
创建文件a.cpp

template <class T> struct atomic { alignas(sizeof(T)) T x; };

struct S0 { static inline atomic<bool> z; };

int main() { (void) S0::z; }

和文件b.cpp

template <class T> struct atomic { alignas(sizeof(T)) T x; };

struct S1 { atomic<bool> y; };

struct S0 { static inline atomic<bool> z; };

void f() { (void) S0::z; }

然后使用“cl /nologo /std:c++17 /GL a.cpp b.cpp”进行编译,该代码将发出:

a.cpp
b.cpp
warning C4744: 'static struct atomic<bool> S0::z' has different type in 'b.cpp' and 'a.cpp': '__declspec(align(1)) struct (1 bytes)' and 'struct (1 bytes)'
Generating code
Finished generating code

值得注意的是,如果S1S0的宣告在b.cpp中重新排序,则不会发出警告。

相关问题