gpt4 book ai didi

c++ - constexpr 函数参数作为模板参数

转载 作者:IT老高 更新时间:2023-10-28 21:40:27 28 4
gpt4 key购买 nike

我正在使用 c++11 玩一些玩具代码,以了解更多关于事情如何工作的信息。在此期间,我遇到了以下问题,简化为:

template <int x, int y>
class add {
public:
static constexpr int ret = x + y;
};

constexpr int addFunc(const int x, const int y) {
return add<x,y>::ret;
}

int main() {
const int x = 1;
const int y = 2;
cout << add<x,y>::ret << endl; // Works
cout << addFunc(1,2) << endl; // Compiler error
return 0;
}

我使用的是 GCC 4.8.1,输出是:
“x”不是“int”类型的模板参数中的常量表达式
“y”不是“int”类型的模板参数中的常量表达式

我尝试计算 add::ret 的两种方法之间到底有什么区别?这两个值都应该在编译时可用。

最佳答案

您告诉编译器,addFunc 将是一个 constexpr。但它依赖于不是 constexpr 本身的参数,因此编译器已经对此感到窒息。将它们标记为 const 仅意味着您不会在函数体中修改它们,此时不考虑您对函数的特定调用。

有一种方法可以让编译器明白你只是将编译时常量传递给 addFunc: 使参数成为模板参数本身:

template <int x, int y>
constexpr int addFunc() {
return add<x,y>::ret;
}

然后调用为

cout << addFunc<1,2>() << endl;

关于c++ - constexpr 函数参数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582875/

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