gpt4 book ai didi

C++ 模板函数优化失败

转载 作者:太空狗 更新时间:2023-10-29 20:39:39 34 4
gpt4 key购买 nike

根据我的理解,不会采用在编译时评估为 false 的分支。在下面的代码中,编译器不应该丢弃包含导致错误的行的 block 吗?

#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”)和使用 nvcc(用cuda 内核中的类似代码)。

最佳答案

我认为您误解了编译器的工作方式。实例化模板时可以随意丢弃检查,但如果编译器要实例化模板,则它必须首先进行编译。由于它不编译,并且没有可供使用的替代模板,因此它将因编译错误而失败。

如果这是一个模板,您可以通过部分特化使其成为可能:

#include <iostream>

template<int i1, int i2>
class TemplateFunc {
public:
void operator()() {
...code with an if...
}
};

template<int i1>
class TemplateFunc<i1, 0> {
public:
void operator()() {
...code without and if...
}
};

int main(int argc, char** argv)
{
TemplateFunc<1,2>()();
TemplateFunc<3,0>()();
return 0;
}

在这段代码中,带有 if 的模板不会因为特化而被编译器选中,因此不会出现编译错误。但对于函数而言,这种方法根本不符合当今标准。

关于C++ 模板函数优化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148282/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com