为什么std :: extent适用于auto&产量为零?

时间:2016-03-31 12:48:00

标签: c++ c++11

我正在尝试使用constexpr auto和字符串文字来获取我可以用std::begin以通用方式使用的字符数组,当我碰到我无法解释的内容时:表达式{{ 1}},其中std::extent<decltype(foo)>::value使用自动引用声明,产生零。

foo

上面的代码给出了输出

 #include <iostream>
 #include <type_traits>

 namespace {
   auto& ARRAY_REFERENCE = "foo";

   template<typename T, std::size_t N>
   std::size_t numberOfElementsIn(T (&)[N]) { return N; }
 }

 int main() {
   std::cerr <<
     "std::extent applied to ARRAY_REFERENCE: " << std::extent<decltype(ARRAY_REFERENCE)>::value << "\n"
     "Number of elements in ARRAY_REFERENCE: " << numberOfElementsIn(ARRAY_REFERENCE) << "\n"
     ;
   return 0;
 }

为什么涉及std::extent applied to ARRAY_REFERENCE: 0 Number of elements in ARRAY_REFERENCE: 4 的表达式不能评估为4?

1 个答案:

答案 0 :(得分:8)

对于RTFM抱歉(不抱歉),但来自std::extent at cppreference.com

  

如果T是数组类型,则提供的成员常量value等于数组N维上的元素数,如果N所在[0, std::rank<T>::value)对于任何其他类型,或者如果T是第一维未知边界的数组且N为0,则 value为0

您的T不是数组类型;它是一种参考类型。

您可以使用std::remove_reference

解决此问题
std::extent<std::remove_reference<decltype(ARRAY_REFERENCE)>::type>::value

live demo

C ++不是很棒吗?