问题是在哪里初始化c++17或更新版本中的静态常量成员?请考虑以下两种在c++中初始化静态常量成员的解决方案:
解决方案1(适用于c++14或更早版本(:
//foo.h:
#include <iostream>
struct foo{
static const std::string ToBeInitialized;
};
//foo.cpp
#include <iostream>
#include "foo.h"
const std::string foo::ToBeInitialized{"with a value"};
解决方案2(适用于c++17或更新版本(:
//foo.h:
#include <iostream>
struct foo{
inline static const std::string ToBeInitialized{"with a value"};
};
目前我更喜欢解决方案2,因为它更短。使用解决方案1或解决方案2有哪些优点和缺点?
我很清楚有几个关于静态常量初始化的问题:
如何在C++中初始化静态常量成员?
C++在哪里初始化静态常量
静态常量成员变量初始化
然而,上述问题中没有一个明确处理c++17或更新版本。
据我所知,不同之处在于;"非直列";静态变量被编译为单个实例;内联";一个被编译为每个翻译单元一个,然后被链接器消除为一个。这意味着";内联";消除只能发生在链接代码内,不能跨越动态链接代码。我相信在这个线程中已经提供了一个很好的解释内联静态常量与静态常量变量。祝你好运