据我了解,编译时评估为false的分支将不会被执行。在下面的代码中,编译器不应该舍弃包含导致错误的行的代码块吗?
#include <iostream>
template<int i1, int i2>
void TemplateFunc()
{
std::cout << i1 << std::endl;
if(i2 > 0)
{
std::cout << i2 << std::endl;
// The following causes an error
// "cannot allocate an array of constant size 0"
int someThing[i2] = {276};
std::cout << someThing[i2/2] << std::endl;
}
}
int main(int argc, char** argv)
{
TemplateFunc<1,2>();
TemplateFunc<3,0>();
return 0;
}
我已经尝试过使用VS 2012,g++(在coliru上使用“g++ -std=c++11 -O3 -Wall -pedantic -pthread main.cpp && ./a.out”)以及在CUDA内核中使用类似代码的nvcc。
i2
也可能是负数,所以我没有简单地为i2 == 0
的情况进行特化。 - user743382TemplateFunc<1,2>()
并不会调用你的operator()
。它只是构造了一个TemplateFunc<1,2>
对象。如果要调用你的operator()
,你需要写成TemplateFunc<1,2>()()
,但我想避免这种情况。 - user743382