【发布时间】:2014-09-20 22:38:50
【问题描述】:
我不明白这个说法:f().array;...
是函数调用吗?还是访问类的属性?
语句data f(); 是构造函数的调用?对吗?
#include <iostream>
using namespace std;
void f()
{
cout << "hello!" << endl;
}
struct data
{
int array[10];
};
int main()
{
data f();
f().array;
return 0 ;
}
【问题讨论】:
-
GCC 究竟是如何在没有一次诊断的情况下编译它的?
void f()和data f()没有兼容的类型,clang 以硬错误拒绝它。 -
@hvd 它甚至为我运行。打印
hello! -
@hvd,我也对此感到很困惑,即使
-Wall -Wextra -pedanticg++没有吐出任何错误。clang++也不在我这边编译。 -
我不明白所有的反对票,这似乎是一个合理的问题,我希望有人解释为什么
f().array在g++下编译并打印hello!。所以它调用了void f(),然后认为你实际上调用了data f(),最后访问了它的成员array?这是荒谬的,clang不接受此代码(不能通过返回类型重载)。当然,陷入这一切的原因是最令人烦恼的解析,但在我看来,这仍然是一个好问题。 -
@sharth,我知道
f()返回一个数据(至少是main中定义的版本)。我的问题是:为什么它在g++下打印hello!?似乎调用了void f()。而且根本不应该编译这段代码,因为你通过返回类型重载了。