使用constexpr时为什么允许这样做?

时间:2014-07-13 13:09:12

标签: c++ c++11 constexpr

我有以下例子:

#include <iostream>
using namespace std;

constexpr int foo(int n){
    return n;
}
int main(){
    int n;
    cin >> n;
    int p[foo(n)];
    cout << sizeof(p); // n * 4
    return 0;
}

我不明白这怎么可能正常工作?我的编译器(C ++ Builder XE6 - Clang)给出了关于sizeof的好结果但是我通过了非常量的&#39; n&#39; to foo并将其作为常量表达式返回?

1 个答案:

答案 0 :(得分:3)

这是一个编译器扩展,它允许非编译时大小的数组。您不需要foo,因为它会在可能的情况下生成编译时值,但当然,当您传递非编译时参数时,它也可以在运行时运行。

有趣的是,现在即使sizeof(p) 也不再是编译时的价值:

#include <iostream>
using namespace std;

constexpr int foo(int n){
    return n;
}

template<unsigned n> void f();

int main(){
    int n;
    cin >> n;
    int p[foo(n)];
    f<sizeof(p)>(); // oops
    return 0;
}

的产率:

main.cpp:14:18: error: '(long unsigned int)((((sizetype)<anonymous>) + 1u) * 4u)' is not a constant expression

     f<sizeof(p)>(); // oops
                  ^

Live example