我是用实验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;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我输出
std::extent applied to ARRAY_REFERENCE: 0
Number of elements in ARRAY_REFERENCE: 4
Run Code Online (Sandbox Code Playgroud)
为什么涉及的表达式不能std::extent评估为4?
对不起(不抱歉)RTFM,但是来自std::extentcppreference.com:
如果
T是数组类型,则提供的成员常量value等于N数组中第th维的元素数(如果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
Run Code Online (Sandbox Code Playgroud)
C++不是很棒吗?