inline T var_no_scope;
inline static T static_var_no_scope;
namespace scope {
inline T var_scope;
inline static T static_var_scope;
}
任何解释都将不胜感激!
inline T var_no_scope;
inline static T static_var_no_scope;
namespace scope {
inline T var_scope;
inline static T static_var_scope;
}
在命名空间范围:
似乎inline static
等价于只有static
。
对变量使用inline
只有在多个翻译单元中定义同一变量时才有效。由于static
将变量限制为单个TU,所以不能有超过一个定义。
在类的作用域:
inline
只能出现在static
变量上。
它具有普通的效果,允许您直接在头文件中初始化变量。可以选择以下方式之一:
struct A
{
inline static int a = 42;
};
struct A
{
static int a;
};
inline int A::a = 42;
函数范围:
inline
不允许使用。
inline
的简单 static
变量需要有一个外部编译单元(即在仅头文件库的情况下,C++17 之前的代码需要解决问题)。正如你的回答所述,inline static
变量使它们成为可能。我认为这是值得一提的事情。 - Dávid Tóth对我而言,当它是数据成员时就更有趣了。在 C++17
中,您可以将静态数据成员声明为 inline
。优点是您不必在 源文件
中为它们分配空间。例如:
class A
{
// Omitted for brevity
static inline int b = 0;
};
int A::b;
可以被删除。关于内联变量以及为什么我们想要使用它们的出色答案可以在这里找到。简而言之,内联变量允许在多个文件中有多个变量定义,这将导致内存中只有一个变量。这允许在头文件中使用constexpr全局变量。
header.h
namespace constants
{
inline constexpr double P = 1.11;
}
当定义具有不同的值时,行为是未定义的,但是仅由头文件引起的定义乘法时,这不应该是问题。
其他人指出了类中的一个好的应用:
template<typename T>
struct C
{
static inline constexpr int c = 10;
};
接下来你可以在任何地方引用这个变量,例如:
C<int>::c;
C++参考定义:https://en.cppreference.com/w/cpp/language/inline引用
内联变量被定义为内联静态关键字。因此,内联静态vartype yourvariablename //是一个内联变量。
有趣的是,关于内联函数,“如果一个完全在类/结构/联合定义内部定义的函数,无论它是成员函数还是非成员友元函数,都会自动成为内联函数,如果它附加到全局模块”(C++20)
从个人经验来看,这就是为什么内联静态是一个非常重要的事情:
如果你只需要在C++文件中初始化静态变量,那么你可以删除C++文件并使用内联静态初始化(但你的代码将需要C++17及以上版本)
在C++ 17之前的类名模板中初始化静态变量只是过于冗长。你必须做一些像这样的事情:
template
class classname
{
static yourtype yourstaticvariable = yourvalue; // and you'll have to initialize it
};
template yourtype classname::yourstaticvariable = yourvalue;
或者使用内联静态方法,你可以这样做:
template <class T>
class classname
{
static yourtype yourstaticvariable = yourvalue; // initialized
}
但是内联静态也有一些注意事项:
但总体而言,这是一个非常棒的功能。如果有疑问,请使用内联静态进行初始化,并打破我需要一个c++文件来初始化静态变量模式。
static
具有外部链接性,且“...它在每个翻译单元中具有相同的地址...”来自 http://en.cppreference.com/w/cpp/language/inline - Richard Critten