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 有一个静态成员变量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中有变化吗?
它看起来像VS2017中的一个错误.
可以找到一些相关的错误报告,虽然它们不完全符合您的情况:
这将在15.7中解决 - 感谢您的报告!将相邻静态变量的多个保护组合成单个保护是后端优化,在某些情况下内联时可能会出错.这基本上是问题所在.
希望这个静态变量在内联版本的 bug中很快就会在下一个补丁中修复.
同时,我发现,在编译Release Mode使你的reporter初始化一次不如预期,而在Debug Mode这个bug出现为他们的后端优化.
所以我想这至少不会进入你的产品.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |