【问题标题】:Does template function declared constexpr allways inline even if instantiation is not constexpr?即使实例化不是 constexpr,声明 constexpr 的模板函数是否总是内联?
【发布时间】:2017-03-16 13:03:37
【问题描述】:

根据这个answer constexpr 函数总是inline

即使所有特化不满足成为constexpr 函数的要求,模板函数也可以声明为constexpr。在最后一种情况下,专业化不是constexpr

例如:

template<class T>
constexpr decltype(auto) size(const T& a){
   return a.size();
}
std::array<int,10> arr;
std::vector<int> vec;
size(arr);//constexpr
size(vec);//not a constexpr;

实例化size&lt;std::vector&gt;不是constexpr,而是inline

【问题讨论】:

  • 我怀疑它仍然带有隐含的inline 说明符。但是,实际上inline 它仍然取决于编译器,特殊情况是可以在各种翻译单元中拥有多个定义
  • 考虑添加language-lawyer标签
  • “从 C++17 开始,模板函数可以声明为 constexpr,即使所有特化都不满足成为 constexpr 函数的要求。”从 C++11 开始就是这种情况。
  • 好的,我更正了。

标签: c++ language-lawyer inline constexpr


【解决方案1】:

是的;引用 N4640,[dcl.constexpr]/1:

... 使用 constexpr 说明符声明的函数或静态数据成员隐含地是内联函数或变量。 …

这里的关键是“declared with”——重要的是声明,而不是满足constexpr 的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多