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

c – constexpr函数参数作为模板参数,第1张

概述我正在玩一些玩具代码,使用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 我正在玩一些玩具代码,使用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 – constexpr函数参数作为模板参数全部内容,希望文章能够帮你解决c – constexpr函数参数作为模板参数所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233644.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存