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



我正在试验constexpr auto和字符串文字,以获得可以以通用方式与std::begin一起使用的字符数组,但我遇到了一些无法解释的问题:表达式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

为什么涉及std::extent的表达式的值不为4?

对RTF感到抱歉(不抱歉),但来自cppreference.com:上的std::extent

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

您的T不是数组类型;它是一个引用类型。

您可以使用std::remove_reference:修复此问题

std::extent<std::remove_reference<decltype(ARRAY_REFERENCE)>::type>::value

(现场演示)

C++不是很棒吗?

最新更新