从方法堆栈编译中按值返回实例

时间:2012-03-17 22:47:56

标签: c++ compiler-construction return-value most-vexing-parse

你能解释为什么不能编译:

(这是错误:

../Man.cpp:33:9: error: conversion from ‘Man (*)()’ to non-scalar type ‘Man’ requested)

代码:

Man goo(){
  Man m();
  return m;
}

但这样做:

Man goo(){
    return Man();
}

3 个答案:

答案 0 :(得分:4)

Man m();

这意味着"在程序的其他地方,我将定义一个名为m的函数,该函数不带参数并返回Man"。是的,即使你把它写在另一个函数中也是如此。

Man m;

这意味着" mMan"类型的变量。由于Man是类类型,因此将调用默认构造函数,并且不需要括号。

答案 1 :(得分:3)

在第一个示例中,您不希望使用这些括号:

Man goo(){
  Man m;
  return m;
}

答案 2 :(得分:2)

在第一种情况下你不需要()。隐式构造函数是隐式调用的。

Man goo(){
    Man m;
    return m; 
}

在第二种情况下,您正在调用构造函数。