在下面的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;
}
Run Code Online (Sandbox Code Playgroud) template<typename TA, typename TB>
void foo (TA a, TB b); // #1
template<typename T>
void foo (T a, T b); // #2
int a, b;
foo(a, b);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,调用foo#2.为什么?