【发布时间】:2017-12-14 12:45:47
【问题描述】:
已知以下函数指针有不同的类型:
void foo_int_ref(int&);
void foo_const_int_ref(const int&);
static_assert(
!std::is_same<
decltype(foo_int_ref),
decltype(foo_const_int_ref)
>::value,
"Types should be different");
让我们考虑一下这个概括:
template<typename T>
void foo(T t) {}
template<typename T>
struct ref_vs_const_ref {
typedef decltype(foo<T>) foo_T;
typedef decltype(foo<const T>) foo_const_T;
};
using int_ref_vs_const_ref = ref_vs_const_ref<int&>;
static_assert(
!std::is_same<
typename int_ref_vs_const_ref::foo_T,
typename int_ref_vs_const_ref::foo_const_T
>::value,
"Types should be different"); // -- it fails
最后一个断言失败。出于某种原因,const 丢失了 foo_const_T。但为什么呢?
【问题讨论】:
-
当
T是引用类型时,const T与T([dcl.ref]/1) 相同。在const int&中,const适用于int,而不适用于int&。
标签: c++ templates language-lawyer