C++17:内联变量

提案

C++17 功能特性

提案

GCC

Clang

MSVC

inline 变量

P0386R2

7

3.9

19.12*

内 联 变 量 的 动 机 起 源 于 David Krauss 的https://wg21.link/n4147提 案, 之 后 由 Hal Finkel 和 Richard Smith在https://wg21.link/n4424中首次提出。

最终被接受的是 Hal Finkel 和 Richard Smith 发表于https: //wg21.link/p0386r2的提案。

语法


inline int num(0);

  • 在 C++里不允许在类里初始化非常量静态成员,但可以在类定义的外部定义并初始化非常量静态成员(头文件里),但如果被多个 CPP 文件同时包含的话又会引发新的错误。
class MyClass {
	static std::string msg;
};
std::string MyClass::msg{"OK"}; // 如 果 被 多 个CPP文 件 包 含 会 导 致 链 接ERROR
// 但可以只在CPP里定义
  • 拥有外部链接的包含于多个源文件的变量必须是 inline 的,此定义即使被多个编译单元使用,也会指向同一个对象。
class MyClass {
	inline static std::string msg{"OK"}; // 自 从C++17起OK
};
inline MyClass myGlobalObj; // 即 使 被 多 个CPP文 件 包 含 也OK
  • 对于静态成员,constexpr修饰符现在隐含着 inline。
struct D {
	static constexpr int n = 5; // C++11/C++14: 声 明
																						// 自 从C++17起: 定 义
}
  • 通过使用 thread_local你可以为每个线程创建一个内联变量
struct ThreadData {
	inline static thread_local std::string name; // 每 个 线 程 都 有 自 己 的name
};
inline thread_local std::vector cache; // 每 个 线 程 都 有 一 份cache
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章