[問題] 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