В следующем коде С++ 11 последний вызов arraySize вызывает ошибку компиляции. По-видимому, это потому, что y является массивом размера времени выполнения, а параметр шаблона N массива N не может быть выведен для y. Я не понимаю, почему x является массивом размера времени компиляции, но y заканчивается размером времени выполнения. Функция шаблона arraySize берется непосредственно из пункта 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;
}