我正在尝试使用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?
答案 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
C ++不是很棒吗?