模板函数类型推导,以及return类型

Template function type deduction, and return type

为什么atrue,而bfalse?或者换句话说,为什么 foo1 中的 Tint constfoo2 的 return 类型只是 int?

template<typename T>
constexpr bool foo1(T &) {
    return std::is_const<T>::value;
}

template<typename T>
T foo2(T &);

int main() {
    int const x = 0;
    constexpr bool a = foo1(x);
    constexpr bool b = std::is_const<decltype(foo2(x))>::value;
}

名为 const int foo2<const int>(const int&); 的特化具​​有 const int 类型的 return,因此 foo2(x) 本来就是 ​​const int 类型的纯右值。但是,没有 const(或 volatile)非数组、非 class 类型的纯右值(在您的情况下为 int)。 constness 被调整掉 "prior to any further analysis",它变成 int 类型的纯右值,decltype 报告。

如果函数返回类型为非class、非数组类型,则忽略常量限定符。如果你使用一些 class 而不是普通的 int 它将产生 1 1:

  struct Bar{};

  int main()
  {
     Bar const x{};
     constexpr bool a = foo1(x);
     constexpr bool b = std::is_const<decltype(foo2(x))>::value;
  }

online compiler