为什么 constexpr 函数可以很好地处理在 运行 时间内生成的变量?

why constexpr function works well with a variable which generated in running-time?

以下代码在clang++3.6/g++4.8.2中运行良好,ubuntu。我想知道为什么这段代码可以编译(使用 -std=c++14/c++11)并打印出正确的结果“4”。以我的理解*pi的值只能在运行时计算,数组的长度需要在编译时计算,对吧?

constexpr int foo(int i,int j)
{   
    return i+j;
}   

int bar(int *p)
{
    int i=pow(2,*p);
    return i;
}  

int main()
{
    int *pi = new int;
    *pi = 1;
    *pi = bar(pi);
    int arr3[foo(*pi,*pi)]; // the length of array need to be calculated in compile time
    cout<<sizeof(arr3)/sizeof(arr3[0])<<endl;

}

在运行时计算。

int arr3[expr]

不需要在编译时已知的大小值。所以问题是,如果没有优化 g++ 会将数组大小保存在局部变量中,或者通过优化它会执行一些静态分析。这就是它在 运行 时知道 sizeof 的方式。

例如:

#include <stdio.h>

int main()
{
    int i;
    scanf("%d", &i);
    int arr3[i];
    printf("%d\n", sizeof(arr3));
}

生成以下程序集片段(g++ -S -O3)

movl    -4(%rbp), %esi
shlq    , %rsi
leaq    L_.str1(%rip), %rdi
xorl    %eax, %eax
callq   _printf

i的值存储在-4(%rbp).

总的来说constexpr与这个问题无关。同样正如@MarcGlisse 指出的那样,可变长度数组 不是标准的一部分,这实际上是一个g++ 扩展。