c++ - 在 C++17 或更新版本中在哪里初始化静态常量成员?

标签 c++ initialization constants c++17 c++20

问题是在 C++17 或更高版本中在哪里初始化静态 const 成员?请考虑以下两种在 C++ 中初始化静态 const 成员的解决方案:

解决方案 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++17 或更高版本。

最佳答案

据我了解,区别在于“非内联”静态变量被编译为单个实例,而“内联”静态变量被编译为每个翻译单元一个实例,然后由链接器消除为单个实例。这意味着“内联”消除只能发生在链接代码内,它不能跨动态链接代码。我相信这个线程Inline static const vs static const variable中已经提供了很好的解释。祝你好运!

关于c++ - 在 C++17 或更新版本中在哪里初始化静态常量成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65084349/

相关文章:

c++ - 我可以从现在开始创建一个变量 _const 吗?

vba - 在 VBA 中计算常量时溢出

c++ - 如何在类构造函数和重载运算符中创建不同的类对象(C++)

c++ - 为什么 Doxygen 将此方法报告为属性?

javascript - 当我们在 JavaScript 中将字符串变量初始化为 null 或空字符串时,有什么区别?哪个是首选

tsql - 试图在 case 语句中设置变量。

ios - 如何在swift中定义常量?

c++ - 在编译时检测 ICC 与 GCC

C++ 错误 : "No match for call to"

c# - 在 View 完成加载之前调用绑定(bind)属性的 setter