【问题标题】:Is "inline" required for "void f(auto) {}" in a header?标题中的“void f(auto) {}”是否需要“内联”?
【发布时间】:2020-04-12 16:31:35
【问题描述】:

考虑

template<typename T>
inline void f(T) {} // "inline" can be safely removed.

inline void f(auto) {} // Can "inline" also be safely removed?

根据 C++ 标准,可以 inline 在后一种情况下安全删除吗?

【问题讨论】:

  • 如果“后一种情况”被包含在两个或多个翻译单元中并使用,并且使用相同的参数类型调用它,当然不是。这应该是相当明显的。
  • @SamVarshavchik 虽然它是一个模板,但至少常规模板是隐式内联的。
  • 这两个inlines 在模块上下文中都有一个meaning,即使它们是类成员。
  • @HolyBlackCat 模板不暗示内联!!

标签: c++ templates inline auto c++20


【解决方案1】:

来自[dcl.fct]/18

缩写函数模板是具有一个或多个通用参数类型占位符 ([dcl.spec.auto]) 的函数声明。缩写函数模板等效于函数模板 ([temp.fct]),其模板参数列表包括一个发明的类型模板参数,用于函数声明的每个通用参数类型占位符,按顺序外观。

添加了重点。这不会为 inline 不是默认值留下很大的回旋余地。

【讨论】:

  • 默认情况下模板不是内联的(这在模块中很重要);它们只是在 ODR 中内联函数(和变量)一起提及。
猜你喜欢
  • 2012-12-09
  • 2010-12-26
  • 1970-01-01
  • 2014-08-16
  • 2013-09-01
  • 1970-01-01
  • 2012-09-23
  • 2012-09-28
相关资源
最近更新 更多