模板函数被实例化后,你的程序就等同于以下内容:
constexpr
int get_size(int (&)[10])
{
return 10;
}
int main()
{
int xs[10];
constexpr int y = get_size(xs); // HERE.
static_assert(10 == y, "wrong size");
}
然后在函数调用替换之后,它变得等价于以下内容:
int main()
{
int xs[10];
constexpr int y = 10; // HERE.
static_assert(10 == y, "wrong size");
}
函数调用替换在 7.1.5 [dcl.constexpr]/5 中描述。本质上,参数就像复制初始化一样被替换,然后替换为返回表达式中的出现。然后返回表达式同样如同复制初始化返回值一样。然后,生成的表达式将成为替换函数调用的表达式。只有在此之后,才考虑表达式是否满足上下文放置的常量表达式的约束。(注意,高质量的编译器当然可以确定 constexpr 函数在任何此类操作后永远无法成功使用,并且在遇到函数定义后可能会失败,但并非必须如此)
另请注意,只是为了让您感到困惑,这个概念在 C++14 中被删除,并替换为如何评估 constexpr 函数的不同概念。除其他外,您将能够在 constexpr 函数中使用 if 语句、for 语句和文字类型的局部变量。