C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – constexpr函数参数作为模板参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在玩一些玩具代码,使用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的两种方式之@L_197_3@区别究竟是什么?这两个值都应该在编译时可用.

解决方法

你告诉编译器,addFunc将是一个constexPR.但是它依赖于参数,这不是constexpr本身,所以编译器已经扼制了.标记它们只是意味着你不会在函数体中修改它们,并且在这一点上不虑对函数进行的具体调用.

有一种方法可以使编译器了解你只会将编译时常数传递给addFunc:使参数成为一个模板参数本身:

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

然后调用

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

大佬总结

以上是大佬教程为你收集整理的c – constexpr函数参数作为模板参数全部内容,希望文章能够帮你解决c – constexpr函数参数作为模板参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。