你能弄清楚下面的陈述有什么问题吗?
GCC错误状态:
'type name'声明为函数返回数组
#define MACRO(a) (a)[1]
class index {
public:
typedef int index_type[2];
const index_type& operator[](int i) const;
};
int k = 0;
int i = MACRO(index()[k]);
顺便说一句:我知道出了什么问题,我认为这是有趣的事情。非常感谢litb,他对以前的问题的解释很快就帮助解决了这个错误。
答案 0 :(得分:4)
在扩展的行中:
int i = (index()[k])[1];
(index()[k])
被解释为强制转换表达式,声明一个返回索引长度为k
的数组的函数。至少,这就是它看起来正在发生的事情。 gcc如何设法有效地将[1]
解释为表达式,我不确定。
答案 1 :(得分:2)
我的猜测是你的语法有歧义。编译器可能正在查看扩展的宏:
int i = (index()[k])[1];
并认为index
实际上是一个返回数组的非成员函数声明,而不是构造 type index
的临时对象。
但这只是猜测...如果你已经知道答案,请启发我们:)
答案 2 :(得分:1)
应用宏时,它会扩展为:
class index
{
// ...
typedef int index_type[2];
const index_type& operator[](int i)const;
// ...
};
int k = 0;
int i = (index()[k])[1];
现在问题(假设index :: operator []是公共的,并且从你的代码片段中看不明显的是)index :: operator []的结果是通过引用返回的,而你正在构造index()对象作为临时对象,因此,假设你的index :: operator []被实现,我猜你已经实现了它(返回对成员对象的引用),index ::的结果返回后,operator []将立即失效(因为临时被破坏),因此你有不确定的行为。