c++ - 对 constexpr 函数的嵌套调用
问题描述
以下(一般)情况:
我试图constexpr
在一个类中调用另一个成员函数,但我得到了错误'this' is not a constant expression
。我现在的问题是(因为我是这个constexpr
习语的新手),是否不允许这样的用例。否则,我将如何解决它?
#include <iostream>
class cc
{
public:
cc()=default;
~cc()=default;
// public method to call th eprivate constexpr functions
template<int varbase>
constexpr void doSomething()
{
static_assert(varbase>0, "varbase has to be greater zero");
// nested call to constexpr functions
char x=testM2<testM1<varbase>()>();
}
private:
template<int var1>
constexpr int testM1()
{
int temp=var1;
return (++temp);
}
template<int var2>
constexpr char testM2()
{
int temp=var2;
if (temp==2)
return 'A';
else
return 'B';
}
};
int main()
{
cc obj;
obj.doSomething<1>();
return 0;
}
解决方案
所以constexpr
并不意味着“这个函数只能在编译时调用”。这意味着“可以在编译和运行时调用此函数”。
char x=testM2<testM1<varbase>()>();
如果在运行时调用,则 的值this
不是编译时常量。所以constexpr
方法调用的结果不是编译时的值,所以它的结果不能用作模板参数。
如果您没有使用this
(因为您似乎没有使用),那么将testM2
等标记为static
解决您的问题。如果您正在使用,this
那么没有简单的解决方法;没有办法说“这个函数只会在编译时调用”。任何解决方法都将取决于您正在做什么的详细信息this
和返回值(如果可能的话)。写一个添加了这些细节的新问题。
推荐阅读
- azure - Azure 数据工厂无法在 Blob 存储链接服务中参数化 Key Vault secretName
- python - 对于博客文章,我使用了 many_to_many 归档的标签。现在我尝试将 Django_Taggit 用于标签字段,但是在迁移时遇到了一些错误
- c++ - 将 shared_ptr 保存到类中的实现的设计模式和优点是什么?
- javascript - 从数组角度中删除指定的项目
- javascript - 使用脚本后无法获取背景图像以在网页上全屏显示
- python - 使用python将蛋白质序列转换为DNA
- node.js - NodeJS express, how te return a result of a function called with express post
- node.js - 微服务架构任务系统问题
- flutter - Flutter DataTable 选择行
- python - 将文本文件转换为字典python