在 2016 年奥卢 ISO C++ 标准会议上,一项名为内联变量被标准委员会投票纳入C++17。
通俗地说,什么是内联变量,它们如何工作以及它们有什么用?内联变量应该如何声明、定义和使用?
提案第一句话:
” The inline
说明符可以应用于变量以及函数。
保证效果inline
应用于函数时,是允许在多个翻译单元中通过外部链接对函数进行相同的定义。实际上,这意味着在标头中定义可以包含在多个翻译单元中的函数。该提案将这种可能性扩展到变量。
因此,实际上,(现已接受的)提案允许您使用inline
定义外部链接的关键字const
命名空间范围变量,或任何static
类数据成员,在头文件中,以便当该头包含在多个翻译单元中时产生的多个定义对于链接器来说是可以的——它只是选择one其中。
直到 C++14(包括 C++14),内部机制一直存在,以支持static
类模板中的变量,但没有方便的方法来使用该机制。人们不得不诉诸诸如此类的技巧
template< class Dummy >
struct Kath_
{
static std::string const hi;
};
template< class Dummy >
std::string const Kath_<Dummy>::hi = "Zzzzz...";
using Kath = Kath_<void>; // Allows you to write `Kath::hi`.
从 C++17 开始,我相信人们可以这样写
struct Kath
{
static std::string const hi;
};
inline std::string const Kath::hi = "Zzzzz..."; // Simpler!
...在头文件中。
该提案包括以下措辞
”内联静态数据成员可以在类定义中定义,并且可以指定大括号或等于初始化器。如果该成员声明为constexpr
说明符,它可以在没有初始化程序的命名空间范围中重新声明(此用法已弃用;请参阅 D.X)。其他静态数据成员的声明不得指定大括号或等于初始化器
...这使得上面的内容可以进一步简化为
struct Kath
{
static inline std::string const hi = "Zzzzz..."; // Simplest!
};
…正如 T.C 在一条评论对于这个答案。
另外,constexpr
说明符意味着inline
对于静态数据成员和函数。
Notes:
¹ For a function `inline` also has a hinting effect about optimization, that the compiler should prefer to replace calls of this function with direct substitution of the function's machine code. This hinting can be ignored.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)