constexpr class 成员的优缺点

Pros and cons of constexpr class members

比较这两种方法:

// MyClass.hpp
class MyClass
{
  static constexpr char* const FOO = "bar";
};

对比

// MyClass.hpp
class MyClass
{
  static const char* const FOO;
};

// MyClass.cpp
const char* const MyClass::FOO = "bar";

哪个更好?我想在第二种情况下,"bar" 字符串只分配一次,而在第一种情况下,每个包含我的 header 的 .cpp 都会分配一次。我对么?还有其他要考虑的地方吗?

第一个版本仅在 c++17 之后才有可能。它之所以有效,是因为所有声明为 constexpr 的静态成员变量都隐含地 inline.

允许多个定义(在单独的编译单元中)但是当链接时只有 1 个。所以你假设它在每个 .cpp 文件中分配一次是不正确的。

哪一个更可取取决于。如果我知道我永远不会改变它,或者很少改变它,我会选择第一个选项。

如果我需要更改它,它可能会导致 #include 它的所有 .cpp 个文件必须重新编译,然后最好将它分开在 .cpp 文件。