c – constexpr函数参数作为模板参数

前端之家收集整理的这篇文章主要介绍了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的两种方式之间的区别究竟是什么?这两个值都应该在编译时可用.

解决方法

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

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

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

然后调用

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

猜你在找的C&C++相关文章