Today, while compiling some code with GCC 4.9.2 for the first time, I encountered a strange error about an array being interpreted as an array of references.
I was able to reproduce the error with a quick example. Why is the constructor of Link interpreting buses as an array of references in the constructor of Stuff.
The following code works with MSVC10 and 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; } But with GCC and Clang, this gives an error :
main.cpp: In function 'int main()': main.cpp:44:32: error: declaration of 'buses' as array of references Stuff s(Link<Bus>(&buses[0])); Yet, the call to the print function works as intended. I am clueless about why the constructor fails.
I found a solution to that problem, by calling buses lik that in the call to the constructor of Stuff
Stuff s(Link<Bus>((&buses)[0])); But I'm really interested to know why it fails.
Stuff s(Link<Bus>& buses[0]), does it make more sense?Stuff s{Link<Bus>(&buses[0])};...?Stuff s = Stuff(Link<Bus>(&buses[0]));.