如何将cv-qualifier用于返回对数组的引用的方法?

Mar*_*nik 11 c++

如果我有一个成员函数返回对数组的引用(/sf/answers/377931011/),如何在函数中添加const限定符?此代码不在Visual C++ 2010下编译.

struct A
{
    int data[10];

    // this compiles
    const int (&f1())[10]
    {
        return data;
    }

    // error C2143: syntax error : missing ';' before '<cv-qualifer>'
    const int (&f2())[10] const
    {
        return data;
    }
};
Run Code Online (Sandbox Code Playgroud)

Sho*_*hoe 22

我提出的一些解决方案在我看来比这个问题的直接答案更具可读性.我确定那里有C语法爱好者,我向他们道歉,因为我有可怕的记忆,而且我无法记住那些C规则.

输入别名

您可以通过使用类型别名来避免奇怪的基于C的语法:

struct A {
    using data_type = int[10];
    data_type data;
    data_type& f1() { return data; }
    data_type const& f2() const { return data; }
};
Run Code Online (Sandbox Code Playgroud)

Live demo

或者typedef(在C++ 11之前):

struct A {
    typedef int data_type[10];
    data_type data;
    data_type& f1() { return data; }
    data_type const& f2() const { return data; }
};
Run Code Online (Sandbox Code Playgroud)

Live demo

汽车

从C++ 14开始,您还可以使用  auto返回类型:

struct A {
    int data[10];
    auto& f1() { return data; }
    auto const& f2() const { return data; }
};
Run Code Online (Sandbox Code Playgroud)

Live demo

标准阵列

从C++ 11开始,您也可以使用std::array:

struct A {
    using data_type = std::array<int, 10>;
    data_type data;
    data_type& f1() { return data; }
    data_type const& f2() const { return data; }
};
Run Code Online (Sandbox Code Playgroud)

Live demo

并简化为:

struct A {
    std::array<int, 10> data;
};
Run Code Online (Sandbox Code Playgroud)

Live demo

这在功能上有些等同,但在眼睛上更容易.

  • 这是解决问题的有效方法. (2认同)

101*_*010 17

const int (&f2() const )[10]
{
    return data;
}
Run Code Online (Sandbox Code Playgroud)


Bar*_*rry 6

使用typedef.它会让每个人的生活更轻松:

struct A
{
    using Data = int[10];
    Data data;

    Data const& f1()
    {
        return data;
    }

    Data const& f2() const
    {
        return data;
    }
};
Run Code Online (Sandbox Code Playgroud)

同样可以通过以下方式完成std::array<int, 10>:

std::array<int, 10> data;
std::array<int, 10> const& f2() const { return data; }
Run Code Online (Sandbox Code Playgroud)

这是std::array原始数组的另一个优点.