如何返回大小的POD数组引用?

时间:2015-09-27 15:11:06

标签: c++ arrays

我有一个C ++ 03类,只有一个头文件实现。该类使用在所有类之间共享的静态空向量:

static const byte nullVector[64];

当我在课堂外初始化时,链接由于重复的符号而失败。所以我将它移动到一个函数中,根据How to have static data members in a header-only library?

制作了一个静态局部函数

现在我试图从访问者返回该字节数组:

static const byte[64]& GetNullVector {
    static const byte s_NullVector[64] = {
        0,0,0,0,0,0,0,0, ... 0,0,0,0,0,0,0,0
    };
    return s_NullVector;
}

虽然尝试返​​回byte[]&可能看起来很奇怪,但由于编译时断言,我需要它:

COMPILE_ASSERT(DIGEST_SIZE <= COUNTOF(GetNullVector()));

COUNTOF宏需要一个真正的数组,它在指针上失败。当字节数组是静态类成员时,它工作正常。

如何返回对字节数组的引用,并完成其大小,以便诊断在C ++ 03下继续按预期工作?

提前致谢。

这是编译错误的样子。 static const byte[64]static const byte[]的返回类型都会产生错误。

c++ -DNDEBUG -g2 -O3 -fPIC -march=native -pipe -c validat3.cpp
In file included from validat3.cpp:16:
./hkdf.h:33:19: error: expected member name or ';' after declaration specifiers
        static const byte[]& GetNullVector {
        ~~~~~~~~~~~~~~~~~^
./hkdf.h:58:49: error: use of undeclared identifier 'GetNullVector'
        COMPILE_ASSERT(DIGEST_SIZE <= COUNTOF(GetNullVector()));

1 个答案:

答案 0 :(得分:4)

C数组的语法包含它附加到的标识符(例如int array[64])。 当你引用它时,它会变得更加丑陋:

int (&array_ref)[64]

现在如果你想从函数中返回这样的引用:

int (& GetNullVector())[64] { ... }

但是对于某些typedef,你可以避免在下次代码审查中解释这个丑陋的声明;)

typedef byte null_vec_t[64];

static const null_vec_t& GetNullVector()
{
    static const null_vec_t s_NullVector = {0};
    return s_NullVector;
}