模板函数类型推导,以及return类型
Template function type deduction, and return type
为什么a
是true
,而b
是false
?或者换句话说,为什么 foo1
中的 T
是 int const
而 foo2
的 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;
}
为什么a
是true
,而b
是false
?或者换句话说,为什么 foo1
中的 T
是 int const
而 foo2
的 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;
}