[问题] function declaration

楼主: XDucka (Duck)   2017-12-01 17:25:46
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
g++ 4.8.3
程式码(Code):(请善用置底文网页, 记得排版)
#include <iostream>
#include <typeinfo>
using namespace std;
int fff =0;
class C{
public:
C():a(1){ cout <<"GG\n"; fff++;}
C(int x){ a=x; cout <<"Orz\n"; }
int a;
};
int main(int argc, char** argv)
{
int foo1(int, int), foo2(int g, int k);
C c1(),c2();
// compile error -> cout << c1.a << c2.a << endl;
cout << fff << endl;
C c3(10);
int foo3(C());
int foo4(C(C()));
return 0;
}
问题:
本来在跟同事研究copy elision的问题
弄了半天才知道
C c1(C())这样写在main里面根本就不会有一个叫做c1的物件产生...
而是会被当作function declaration
(如上例的compile error)
不过我想问的问题是..
所以foo3 跟 foo4这样写 (compile会过..)
这两个function吃的参数到底是什么意思啊Orz
(稍微google一下好像是只有GCC能够特例让他过0.0
https://bytes.com/topic/c/answers/136234-constructor-function-argument)
是某种function pointer吗?
我implement 他的时候 应该要怎么接到这个... C()..?
int foo3(C()){
//...?
}
作者: eye5002003 (下一夜)   2017-12-01 21:19:00
most vexing我没遇过,可能我运气好一直没凑齐条件吧
作者: LPH66 (-6.2598534e+18f)   2017-12-02 00:12:00
这篇在讲的问题就是 MVP, 楼上提的也是同样的状况要闪就是如上面说的请爱用 {} 初始化
作者: shadow0326 (非议)   2017-12-01 20:47:00
我猜楼上那段会踩到most vexing parse,没试过不确定
作者: eye5002003 (下一夜)   2017-12-01 20:24:00
C c1(C());可以宣告物件啊,只要C有对应的建构子就行例如补上 C(const C &c){this->a=c.a;} 这样的建构子只是没人会这么写就是了而且没人会在函式里做前置宣告的,错误实在太多了
作者: loveflames (咕啾咕啾魔法阵)   2017-12-01 17:46:00
请爱用{}
作者: shadow0326 (非议)   2017-12-01 17:34:00
int foo(C())的意思是,宣告一个叫foo的函数,他的回传型态是int,吃一个function ptr参数,而此参数是一个回传C、不吃任何参数的函数

Links booklink

Contact Us: admin [ a t ] ucptt.com