C ++中的复杂const声明

时间:2011-12-22 14:39:51

标签: c++ const re2

我正在第一次尝试使用C ++,特别是Google RE2库,我仍然坚持使用某些语法。我正在尝试使用签名调用函数:

static bool FindAndConsumeN(StringPiece* input, const RE2& pattern,
                         const Arg* const args[], int argc);

使用代码:

const re2::RE2::Arg match;
bool isMatched = RE2::FindAndConsumeN(&inputPiece, *expression,new const re2::RE2::Arg[] { &match },0)

但是我收到编译错误:

Error   3   error C2664: 're2::RE2::FindAndConsumeN' : cannot convert parameter 3 from 'const re2::RE2::Arg (*)[]' to 'const re2::RE2::Arg *const []'

我清楚地知道第三个参数的数据类型错误,但是有人知道正确的数据类型是什么吗?

我正在使用Visual Studio 2010编译代码

4 个答案:

答案 0 :(得分:2)

你应该使用这样的代码:

re2::RE2::Arg match;
re2::RE2::Arg* args[] = { &match };
re2::RE2::FindAndConsumeN(NULL, pattern, args, 1);

args将转换为const Arg* args[]

内部const没有处理调用代码,只能在FindAndConsumeN内使用。

请勿使用new,因为您之后无法delete数组 (new new const re2::RE2::Arg*[]}

答案 1 :(得分:1)

这里的问题是你需要一个指向常量数据的指针,而不是一个指向数据的常量指针。使用中间变量来存储有问题的参数的值,我认为你将能够对问题进行排序。

答案 2 :(得分:1)

首先,请注意参数声明的含义略有不同 当它们作为函数参数出现时。在这种情况下,实际类型 第三个参数是:Arg const* const*。我认为你不能 在这里使用new expression(如果可以,可以删除它);新的 表达式需要new (Arg const* const [n]);它分配一个n未初始化的const指针数组。 你需要的是更多的东西:

std::vector<Arg const*> args;
//  Fill out args with the desired data...
... , &args[0], ...

答案 3 :(得分:0)

功能签名是:

static bool FindAndConsumeN(StringPiece* input, const RE2& pattern,
                            const Arg* const args[], int argc);

第三个参数是const Arg * const args [],这意味着: 常量的const指针数组,用于键入Arg。

即。数组是常量,每个条目也是const。