規則演進
| 標準 | 類內初始化允許類型 | 備註 |
|---|
| C++98/03 | 僅 static const 整型/枚舉 | 需在類外定義 const double A::rate = 6.5; |
| C++11 | 同上,但引入 constexpr 允許字面量類型 | static constexpr double rate = 6.5; 仍需類外定義(ODR-used) |
| C++17 | inline static constexpr 任意字面量類型 | 類內定義即為定義,無需類外,支援 vector 等非字面量類型需 C++20 |
代碼示例
// C++17 推薦寫法
class Config {
public:
inline static constexpr double RATE = 6.5;
inline static constexpr int VEC_SIZE = 26;
// 非字面量類型 (vector) 仍需類外定義或 C++20
static const std::vector<double> vec; // 類外定義
};
// Config.cpp
const std::vector<double> Config::vec = {1.0, 2.0};
編譯器支持
- MSVC 19.14+ (VS 2017 15.7+) 完整支持 C++17 inline static。
- GCC 7+, Clang 5+ 同樣支持。