【发布时间】:2017-03-08 02:07:55
【问题描述】:
声明有什么好处:
static constexpr const char* K = "k";
对比:
static const std::string K("k");
谢谢
【问题讨论】:
-
嗯,第一个显然是编译时常量表达式,而第二个在运行时分配动态内存。这完全取决于您的用例。
-
那么第一种形式没有明确的优势吗?
声明有什么好处:
static constexpr const char* K = "k";
对比:
static const std::string K("k");
谢谢
【问题讨论】:
有很大的不同,它将如何影响您的代码取决于很多事情。通常不推荐使用第二种,因为您无法保证 std::string 对象何时会被构造或销毁。
最好用Google C++ Style Guide来概括:
禁止使用具有静态存储持续时间的类类型变量:由于构造和销毁顺序不确定,它们会导致难以发现的错误。但是,如果它们是 constexpr,则允许使用此类变量:它们没有动态初始化或销毁。
具有静态存储持续时间的对象,包括全局变量、静态变量、静态类成员变量和函数静态变量,必须是普通旧数据 (POD):只有整数、字符、浮点数或指针,或数组/结构吊舱。
他们禁止第二个:
因此,我们只允许静态变量包含 POD 数据。此规则完全不允许 std::vector(使用 C 数组)或字符串(使用 const char [])。
【讨论】:
std::vector 的替代品完全忽略 std::array。