在以下的C++11代码中,最后一次对arraySize的调用会导致编译错误。显然这是因为y是一个运行时大小的数组,而无法为y推导出arraySize模板参数N。我不明白为什么x是编译时大小的数组,而y最终以运行时大小呈现。arraySize模板函数直接取自Scott Meyers的《Effective Modern C++》第1条款。
#include <cstddef>
template<typename T, std::size_t N>
constexpr std::size_t arraySize(T(&)[N]) noexcept { return N; }
struct S
{
char c[10];
};
int main()
{
S s;
S* ps = &s;
char x[arraySize(s.c)];
char y[arraySize(ps->c)]; // why is y a runtime sized array?
arraySize(x);
arraySize(y); // error !?
return 0;
}
arraySize()
的参数设为一个常量引用,那么以下代码将编译通过:char y[arraySize(decltype(ps->c){})];
- Quentindecltype
是一个未求值的上下文吗?如果省略大括号初始化器,它可能也不起作用。如果编译器真的接受arraySize(s.c)
作为编译时常量表达式,我不知道为什么... - Deduplicator