c ++ 17:仅标题:类静态变量错误

iPh*_*ian 5 c++ static-variables visual-c++ c++17

从C++ 17开始,我一直在尝试更简单的方法来获取类静态变量.我正在写一个仅限标题的库.显然inline,变量的新含义适用于此.

class thingy {
    static inline reporter rep;
};
Run Code Online (Sandbox Code Playgroud)

但我一直在收到运行时错误.

我正在使用Visual Studio 15.6.4

要测试,以下内容:

  • thingy 有一个静态成员变量
  • 该成员告诉您何时构建/破坏以及在何处
  • 应该构造和破坏一次
  • #include是否包含在两个.cpp文件中

foo.h中

#pragma once

#include <iostream>

using namespace std;

struct reporter {
    reporter() {
        cout << "reporter() - " << this << endl;
    }
    ~reporter() {
        cout << "~reporter() - " << this << endl;
    }
};

class thingy {
    static inline reporter rep;
};
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "foo.h"
int main() {}
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

#include "foo.h"
Run Code Online (Sandbox Code Playgroud)

最令人失望的是,它打印出来:

reporter() - 00007FF670E47C80
reporter() - 00007FF670E47C80
~reporter() - 00007FF670E47C80
~reporter() - 00007FF670E47C80
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它被构造了两次并且在同一个位置被破坏了两次 - 并不好.

我误解了inline变量的用途吗?

是否有其他方法只在标题中获取类静态?这在C++ 17中有变化吗?

Dea*_*Seo 6

它看起来像VS2017中的一个错误.

可以找到一些相关的错误报告,虽然它们不完全符合您的情况:

这将在15.7中解决 - 感谢您的报告!将相邻静态变量的多个保护组合成单个保护是后端优化,在某些情况下内联时可能会出错.这基本上是问题所在.

希望这个静态变量在内联版本的 bug中很快就会在下一个补丁中修复.

同时,我发现,在编译Release Mode使你的reporter初始化一次不如预期,而在Debug Mode这个bug出现为他们的后端优化.

所以我想这至少不会进入你的产品.