为什么我的数组声明为引用数组

bl4*_*0ne 3 c++ arrays pointers

今天,在第一次使用GCC 4.9.2编译某些代码时,我遇到了一个奇怪的错误,即数组被解释为引用数组.

我能用一个简单的例子重现错误.为什么Link解释的构造函数是构造函数中buses的引用数组Stuff.

以下代码适用于MSVC10和ICC 11.1

#include <iostream>

struct Bus
{
    Bus(std::string n) : name(n) {}
    std::string name;
};

template<typename T>
class Link
{
public:
    Link(const T* i)
    {
        data = (T*)i;   
    }

    const T* get() const
    {
        return data;
    }
private:
    T* data = nullptr;  
};

class Stuff
{
public:
    Stuff(Link<Bus> l_b) : link(l_b) {}
private:
    Link<Bus> link;
};

void print(Link<Bus> l)
{
    std::cout << l.get()->name << '\n';   
}

int main(void) {
    Bus buses[4] = { Bus("0"), Bus("1"), Bus("2"), Bus("3") };

    print(Link<Bus>(&buses[0]));

    Stuff s(Link<Bus>(&buses[0]));    

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是对于GCC和Clang,这给出了一个错误:

main.cpp: In function 'int main()':

main.cpp:44:32: error: declaration of 'buses' as array of references

     Stuff s(Link<Bus>(&buses[0]));
Run Code Online (Sandbox Code Playgroud)

然而,对print函数的调用按预期工作.我对构造函数失败的原因一无所知.

我找到了解决这个问题的方法,通过在调用构造函数时调用bus lik Stuff

Stuff s(Link<Bus>((&buses)[0]));    
Run Code Online (Sandbox Code Playgroud)

但我真的很想知道它失败的原因.

这里有实例

Som*_*ken 5

你是最令人烦恼的解析规则的受害者.

编译器看到:

Stuff s(Link<Bus>((&buses)[0]));
Run Code Online (Sandbox Code Playgroud)

作为名为的函数的函数声明,该函数s返回一个Stuff对象并请求一个0元素的Link对象引用数组.

要解决这个问题并告诉编译器你实际上是在尝试创建一个Stuff对象,你应该使用{}语法来避免歧义:

Stuff s{ Link<Bus>((&buses)[0]) };
Run Code Online (Sandbox Code Playgroud)

  • 最后一个问答提到了一个最令人烦恼的解析,它实际上是关于最令人烦恼的解析:D (3认同)
  • @ Bl4ckb0ne如果你需要这个来使用pre C++ 11 MSVC,请用parens包围构造函数参数.这也应该有效.即`Stuff s((Link <Bus>(&bus [0])));` (2认同)