使用内联静态数据成员有什么潜在的陷阱吗?
Any potential pitfall of using inline static data member?
C++17引入了内联变量,可以使用初始值设定项在类定义中定义内联静态数据成员。它不需要类外定义。例如
struct X {
inline static int n = 1;
};
鉴于此,我认为没有理由不始终使用内联静态数据成员来实现简洁的语法。这样做有什么陷阱吗?请注意,我不介意编译速度变慢。
不是陷阱,但这里有一个不使用inline
的原因: 如果变量的初始值不仅仅是一个微不足道的常量,而是更复杂的东西:
struct X {
inline static int n = and_then_more(figure_out_where_n_comes_from());
};
现在,必须将figure_out_where_n_comes_from()
和and_then_more()
的声明拉入头文件中。
此外,无论figure_out_where_n_comes_from()
回报,都必须申报。它可能是一些非常复杂的class
,然后作为参数传递给and_then_more()
,以最终计算n
的初始值。
声明X
的头文件#include
的所有内容现在都必须包含所有这些依赖项的所有头文件。
但是没有inline
,你所拥有的只是:
struct X {
static int n;
};
而且您只需要在一个实例化X::x
的翻译单元中处理所有这些依赖项。没有其他#include
只有X
的头文件关心它。
换句话说:信息隐藏。如果需要重新实现n
的初始值的来源,则只需重新编译一个翻译单元,而不是整个源代码。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 有什么陷阱用 constexpr string_view 替换全局 const char[]?
- 使用内联静态数据成员有什么潜在的陷阱吗?
- VS2010的并发运行时和unbounded_buffer<shared_ptr<T>>,有什么陷阱吗?
- 陷阱、错误、失败和程序流产之间有什么区别
- 调用CGPathAddArc时PyQt4/Qt中止陷阱的原因是什么?
- c++模板尖括号陷阱- c++ 11修复了什么?