这个方法声明/定义是什么意思?(与传递数组有关?)

5

你好,我正在浏览一些遗留代码,发现了一个奇怪的方法定义/声明。我有一个猜测它的作用是什么,但我还不能百分之百确定。

声明:

const SomeEnumeratedId (&SomeMethod() const)[SOME_CONSTANT_VALUE];

定义

const SomeEnumeratedId (&SomeClass::SomeMethod() const)[SOME_CONSTANT_VALUE]
{
    return someMemberArray;
}

我的最佳猜测是它正在传递对someMemberArray的引用,并且保证它的大小为SOME_CONSTANT_VALUE,但我从未在方法声明后看到过[]符号,而且有太多的括号。

非常感谢您的帮助。

3个回答

7

这是一个声明,它是一个没有参数并返回一个指向大小为 SOME_CONSTANT_VALUEconst 数组的枚举类型为 SomeEnumeratedIdconst 成员函数。

使用 typedef 可以使其更易于理解。

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE];

SomeArrayType& SomeClass::SomeMethod() const
{
    return someMemberArray;
}

那么方法后面的[SOME_CONSTANT_VALUE]是告诉调用函数返回的引用引用了那个长度的数组吗?这是最让我困惑的部分,因为我从来没有在函数声明中看到过这一部分。我只看到过作为引用或指针传递的数组,而没有在末尾加上那个。 - Michael
@Michael:是的,它是返回类型声明的一部分。 - CB Bailey
考虑一个数组的声明:int x[k]; 现在是对数组的引用:int (&y)[k]; 现在为了声明一个返回数组引用的函数,我们将 y 替换为类似函数调用的东西:int (&(z())[k]; z 是一个返回数组引用的函数。即使 typedef 数组有时会误导人,但明智的人们在这一点上使用 typedef。 - CB Bailey
@Michael:是的,这是C语言极其落后的类型声明语法的后果。这类似于当进行数组typedef时,你会写成这样:typedef int myArrayType[3];,方括号[3]在新类型名称之后,而不是原始类型之后。 - Lightness Races in Orbit

0

那个奇怪的符号,正如@Charles已经指出的那样,是声明/定义一个常量方法,该方法返回存储为成员的元素数组的引用。

语法非常奇怪,可能(并且应该)通过typedef简化:

typedef SomeEnumerated array_t[SOME_CONSTANT_VALUE];
const array_t& SomeMethod() const;

0

是的,这是由于C语言完全反向的类型声明语法造成的后果。这类似于当进行数组typedef时,您会编写以下内容:typedef int myArrayType[3];,在新类型名后面添加[3]而不是原始类型。

如果您非常聪明,可以使用{std,tr1,boost}::array - 值得考虑 - 以便您最终得到:

 array<SomeEnumeratedId, SOME_CONSTANT_VALUE>& SomeClass::SomeMethod() const;

使用typedef的变通方法(在其他答案中探讨)相关,尽管不完全等同于{std,tr1,boost}::array是包装器,而不仅仅是typedefs。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接