首页 > 解决方案 > 对 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;
}

运行上面的例子

标签: c++c++11nestedc++14constexpr

解决方案


所以constexpr并不意味着“这个函数只能在编译时调用”。这意味着“可以在编译和运行时调用此函数”。

    char x=testM2<testM1<varbase>()>();

如果在运行时调用,则 的值this不是编译时常量。所以constexpr方法调用的结果不是编译时的值,所以它的结果不能用作模板参数。

如果您没有使用this(因为您似乎没有使用),那么将testM2等标记为static解决您的问题。如果您正在使用,this那么没有简单的解决方法;没有办法说“这个函数只会在编译时调用”。任何解决方法都将取决于您正在做什么的详细信息this和返回值(如果可能的话)。写一个添加了这些细节的新问题。


推荐阅读