在2016年奥卢ISO C++标准会议上,一项名为Inline Variables的提案被标准委员会投票选为C++ 17.
通俗地说,什么是内联变量,它们如何工作以及它们对什么有用?如何声明,定义和使用内联变量?
考虑以下内联函数:
// Inline specifier version
#include<iostream>
#include<cstdlib>
inline int f(const int x);
inline int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
和constexpr等效版本:
// Constexpr specifier version
#include<iostream>
#include<cstdlib>
constexpr int f(const int x);
constexpr int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:说明constexpr符是否意味着说明inline符,如果一个非常量参数传递给一个constexpr函数,编译器将尝试inline该函数,就像说明inline符被放入其声明一样?
C++ 11标准能保证吗?
由于标准的措辞,C++中的静态类成员给我带来了一点混乱:
9.4.2静态数据成员 [class.static.data]
在类定义中声明静态数据成员不是定义......
但是,constexpr需要在其声明中初始化(AFAIK,无法从标准中找到引用)(例如,在类定义中).
由于constexpr的限制,我实际上已经忘记了在类之外定义静态成员的必要条件,直到我尝试访问静态constexpr数组.这个相关问题提供了定义数组成员的正确方法,但我对类模板中对此定义的含义感兴趣.
这就是我最终得到的结果:
template<typename T>
class MyClass
{
private:
static constexpr std::size_t _lut[256] = { /* ... */ };
T _data;
public:
static constexpr std::size_t GetValue(std::size_t n) noexcept
{
return _lut[n & 255];
}
// ...
};
template<typename T>
constexpr std::size_t MyClass<T>::_lut[256];
Run Code Online (Sandbox Code Playgroud)
这是正确的语法吗?特别是在定义中使用模板感觉很尴尬,但GCC似乎正确地将所有内容联系起来.
作为后续问题,是否应该类似地定义非数组静态constexpr成员(模板定义在类外)?