0

以下代码无法使用 Visual Studio 2012 进行编译并出现错误:C2234: 'Foo' : arrays of references are invalid

struct MyClass
{
  int m_var;
  __declspec(property(get=GetFoo)) int& Foo[];   // < C2234
  int& GetFoo(int) { return m_var; }
};

我想知道为什么会这样。

是的,标准禁止引用数组。然而,Foo[] 不是一个数组,而是一个指向成员函数 GetFoo() 的符号链接。它的行为就像 Foo 是具有重载索引运算符的类一样。另一方面,以下代码是完全合法的,尽管它在技术上等同于前面的代码段:

struct FooClass
{
    int m_var;
    int& operator[](int) { return m_var; }
};

struct MyClass
{
    FooClass Foo;
};

那么为什么会发出错误 C2234 呢?这是编译器设计错误吗?

BTW.: 实际情况更复杂,所以没有必要告诉我将引用交给成员可能是个坏主意。

4

1 回答 1

2

我对这个错误并不感到惊讶,因为int& Foo[];它是一个 int 引用数组的声明。for 的语法__declspec(property)指定此关键字后面是声明符:__declspec(property) 文档。因此,您应该将右侧的文本__declspec(property)视为声明,而不是一些所谓的特殊符号链接。

正如您和您的编译器所指出的,禁止声明引用数组。__declspec(property)该规则也不例外。

您可以使用此替代方法:

struct MyClass
{
    int m_var;
    __declspec(property(get=GetFoo,put=SetFoo)) int Foo[];   // < C2234
    int& GetFoo(int) { return m_var; }
    void SetFoo(int, int v) {m_var = v;}
};

int main()
{ 
    MyClass test;
    test.Foo[0] = 5;

    std::cout << test.Foo[0];

    return 0;
}

如果我是你,我会坚持使用标准 C++ 的优秀操作符 []。__declspec语法特定于 Microsoft 的 Visual Studio。

于 2013-11-01T20:16:30.657 回答