我正在试验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++不是很棒吗?