我有以下例子:
#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并将其作为常量表达式返回?
答案 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
^