2012-02-26 62 views
2
$ cat -n cons.cpp 
    1 #include <iostream> 
    2 
    3 using namespace std; 
    4 
    5 int return1() { 
    6  return 1; 
    7 } 
    8 
    9 int main() { 
    10  cout<< return1.m_one << endl; 
    11  return 0; 
    12 } 
$ g++ cons.cpp 
cons.cpp: In function 'int main()': 
cons.cpp:10: error: request for member 'm_one' in 'return1', 
      which is of non-class type 'int()()' 
$ 

也许这是编译器特定的,但在上面的g ++中报告的int()()中额外的一对括号是否存在一些意义/含义?为什么g ++将函数报告为具有int()()类型?

+1

除非我完全误解了代码,你试图访问一个函数指针的成员?因此错误。它被报告为int()(),它看起来很像int(*)(void),它是一个指向一个函数的指针,它使用void并返回int。可能是错误的,所以只是猜测 – Lefteris 2012-02-26 08:21:01

+0

是的,代码是错误的,我期望一个错误。 – Lazer 2012-02-26 08:41:42

+0

在gcc(4.4。1)(仅限C),错误完全不同。 错误:请求成员m_one中的东西不是结构或联合 在g ++(4.4.1)中:我得到: | error:请求成员'm_one'在'return1'中,它是非类类型的'int()' 因此,它完全是编译器特定的,并且在相同编译器的版本之间不同。 – Lefteris 2012-02-26 08:47:35

回答

5

这种语法的想法是这样声明的参数和返回值:

  • 内部对括号表示我是一个功能
  • 上左侧的int装置我的返回类型为int
  • 右对括号意味着我没有参数

因此,如果功能已宣布

int return1(int a) 

的错误信息会谈论int()(int)

但函数类型的表示方式确实取决于编译器以及版本。例如。我刚刚尝试过的GCC 4.5.1只是简单的说int()就像你所建议的那样更直观。

5

函数指针将是int (*)()int()()不是合法的语法,但我可以看到一个漂亮的打印机如何输出它的函数类型。

这是什么语法将实际上意味着作为一个类型说明符,如果它是合法的,是:

function taking no arguments 
    ↓↓ 
int()() 
↑↑↑ ↑↑ 
    and returning int(), i.e. a function that takes no argument and returns int. 

但在C和C++函数直接,而是返回函数必须返回函数指针禁止的。类似地,你不能直接返回一个数组(int()[10]

函数类型实际拼写的方式没有这些圆括号中的一个。这是合法的时候,例如,用于std::function

   ↓↓↓↓↓ 
std::function< int() > foo = []() -> int { return 1; }; 
+0

+ 1用箭头格式化答案:) – Lefteris 2012-02-26 08:52:39

+0

这个语法实际上是什么意思,如果它是合法的。嗯... – 2012-02-26 08:56:28

+0

@JohanLundberg由于我的意思是你可以使用C++的语法来解析语句,看看它是什么意思,但有一条规则禁止函数返回另一个函数。例如,使用'std :: function'来获取需要类型声明的上下文:'std :: function foo;'给出错误:'error:函数不能返回函数类型'int()'' – bames53 2012-02-26 09:19:45

1

上C++ 11启用编译器,int()()在错误消息中的意思是“可调用元件(第一())不采取任何参数(第二())返回int。(C++ 03和像int(*)() C99函数指针是自解除引用,并调用INT(*)()或INT(&)()是统一消息)

这是return1实际上是(函数指针或引用),而且是int相同,因此需要不是“复合类型”,编译器抱怨.和后面的成员

+0

即使在C++ 11中,int()()也不是合法的语法。它实际上的意思是一个函数,它不需要任何东西,并返回'int()'就像'int()[]'意味着一个函数,它不接受任何东西并且返回一个int数组。在C++ 03以及C++ 11中,这个类型意味着'函数不需要任何东西并且返回一个int',它被拼写成int()。例如。 'std :: function foo = []() - > int {return 1; }' – bames53 2012-02-26 08:43:43

+0

@ bames53 我不说是“法律语法”:我在错误信息中说“它的意思是”。 法律语法为int(* fn)()和int(&fn)(),但由于“call action”对于(fn())都是相同的,所以消息省略了*或&。 对不起,不清楚。我只是更新消息 – 2012-02-26 09:08:44

相关问题