C++ constexpr和函数的使用
我正在尝试使用constexpr和static_断言。我实际上需要检查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
#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的声明、异常规范和非静态数据成员的大括号或相等初始值设定项(包括嵌套类中的此类内容),在函数体、默认参数中,类被视为是完整的。否则,在其自身的类成员规范中,它被视为不完整的。