【发布时间】:2015-01-20 13:24:29
【问题描述】:
在下面的 sn-p 中,一个静态断言通过,另一个失败:
template <class Rng> constexpr bool is_array(Rng&& r) {
// int*** debug = r; // uncomment this to debug r's type
return std::is_array<Rng>{};
// return std::is_array<decltype(r)>{}; // fails too
}
int a[5] = {0, 1, 2, 3, 4};
static_assert(std::is_array<decltype(a)>{}, ""); // passes
static_assert(is_array(a), ""); // fails
提示:去掉注释即可调试类型(正确推断为int [5])。
这是为什么?在 clang 主干上测试。
我猜这与数组衰减为指针有关......不知何故。
解决方案:使用std::remove_reference_t,Rng 将是int (&)[5],这是对数组的引用,而不是数组。
Xeo 添加:
template<class> struct dump;
dump<decltype(r)>{};
将无法编译并显示r 的正确类型。
int**** j = r; 产生了一个错误错误(说不能将int[5] 分配给int****)。
【问题讨论】:
-
尝试插入
remove_reference。 -
@KerrekSB 说得通而且有效,废话。 Clang 错误消息让我失望了,它说无法将
int [5] 分配给int***而不是int (&)[5]或类似的。 -
Scott Meyers 查看
T类型的技巧是template<class> class TD /* undefined */; TD<T> foo;。 -
现在应该结束这个问题吗?
标签: c++ c++14 perfect-forwarding universal-reference forwarding-reference