Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ constexpr和函数的使用_C++_Constexpr - Fatal编程技术网

C++ constexpr和函数的使用

C++ constexpr和函数的使用,c++,constexpr,C++,Constexpr,我正在尝试使用constexpr和static_断言。我实际上需要检查constexpr字符串的长度,它是由专用函数计算的。以下是我试图运行的内容: #include <iostream> using namespace std; class Test { private : static constexpr char str[] = "abc"; static int constexpr constStrLength(const char

我正在尝试使用constexpr和static_断言。我实际上需要检查constexpr字符串的长度,它是由专用函数计算的。以下是我试图运行的内容:

#include <iostream>
using namespace std;

class Test
{
    private :
        static constexpr char str[] = "abc";

        static int constexpr constStrLength(const char* str)
        {
            return *str ? 1+constStrLength(str+1) : 0;
        }
        static constexpr int length = constStrLength(str);
        static_assert(length ==3, "error");

    public :
        static void f()
        {
            cout << len << endl;
        }
};

int main()
{
    Test::f();
    return 0;
}
下面是我得到的错误:

错误:“static constexpr int Test::conststrlengtconst char*”调用 在常量表达式中,静态constexpr int len= 常数长度

实现这一目标的正确方法是什么

谢谢你的帮助

用作constexpr函数的constexpr函数需要在使用点定义。但是,当您使用constStrLength定义长度时,它仅被声明:在类定义中定义的成员函数实际上仅在类定义中声明!它们的定义在类定义之后立即可用,即,在结束括号之后非正式地说

修复方法是在使用constStrLength之前定义它,例如,作为非成员函数或通过在基类中定义它。

作为constexpr函数使用的constexpr函数需要在使用点定义。但是,当您使用constStrLength定义长度时,它仅被声明:在类定义中定义的成员函数实际上仅在类定义中声明!它们的定义在类定义之后立即可用,即,在结束括号之后非正式地说


修复方法是在使用constStrLength之前定义它,例如,作为非成员函数或在基类中定义它。

字符串是否总是初始化为char str[]=。。。?因为在这种形式下,您可以简单地得到sizeofstr-1的长度。@kennytm:除了,这样做会产生错误的结果。例如,sizeofabc\0def-1产生7,而constrllength函数产生3。我的字符串总是这样定义的,但实际上我需要防止字符串中包含\0字符的错误行为。但是谢谢你的提示;字符串是否总是初始化为char str[]=。。。?因为在这种形式下,您可以简单地得到sizeofstr-1的长度。@kennytm:除了,这样做会产生错误的结果。例如,sizeofabc\0def-1产生7,而constrllength函数产生3。我的字符串总是这样定义的,但实际上我需要防止字符串中包含\0字符的错误行为。但是谢谢你的提示;哦,我认为将函数声明为static会直接定义它。谢谢你的帮助,这解决了我的问题,我将使用基类hack@AntoineMorel:我认为相关部分是9.2[class.mem]第2段:类被认为是完全定义的对象类型3.9或类说明符结尾处的完整类型。在类成员规范中,使用引入继承构造函数12.9的声明、异常规范和非静态数据成员的大括号或相等初始值设定项(包括嵌套类中的此类内容),在函数体、默认参数中,类被视为是完整的。否则,它在自己的类成员规范中被认为是不完整的。哦,我认为将函数声明为静态会直接定义它。谢谢你的帮助,这解决了我的问题,我将使用基类hack@AntoineMorel:我认为相关部分是9.2[class.mem]第2段:类被认为是完全定义的对象类型3.9或类说明符结尾处的完整类型。在类成员规范中,使用引入继承构造函数12.9的声明、异常规范和非静态数据成员的大括号或相等初始值设定项(包括嵌套类中的此类内容),在函数体、默认参数中,类被视为是完整的。否则,在其自身的类成员规范中,它被视为不完整的。