int V1() ; int (*V2)() ; 為什麼V1V2是同一類型?

勉励前行 2008-08-30 10:18:21
#include <typeinfo>
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
int V1() ;
int (*V2)() ;
cout<<typeid(V1).name()<<endl;
cout<<typeid(V2).name()<<endl;

int a(); //a = int(*)();//函數指針
int b = int(); //b = 0 ;
}

//想問出處,為什麼?
...全文
346 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
gnidnuy 2008-09-01
  • 打赏
  • 举报
回复
函数名就代表函数的首址,所以一样
Jinhao 2008-08-31
  • 打赏
  • 举报
回复
>>解析為 int V(int ()) --> int V(0) ; 就完全不一樣了。

二义性
看这个 http://blog.csdn.net/Jinhao/archive/2004/06/29/29021.aspx
lonecrystal 2008-08-31
  • 打赏
  • 举报
回复
不一样的,V1是函数名,是函数常量,类型是int (* const)(); V2是int (*)(); 可以让V2 = V1 ;但不能让V1 = V2
blue_zyb 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 PPower 的回复:]
int V1(int ()); // 參數 int () 解析為 int(*)()
為什麼不解析為 int() = 0 呢
int V1(int ()) = int V1(0) ; //這樣的解析過程錯了,為什麼。
[/Quote]

我想lz的主要疑问就在此吧。

我想提出的一个视角是:
如果不是int V1(int());
而是有另外的一个类class CC;
然后有声明 int V1(CC());
那么只要CC不提供到int的转换操作(一般来说这个可能性不大,你根本无法假设所有的类都提供到int的转换),
int V1(CC())中的CC()就只能解析为CC (*p)(),即一个函数指针。

那么对于int这个特殊的类型,由于一视同仁的原则,也统一采用了函数指针的解释。
因为你总不好CC()解释为指针,int()就解释为构造函数返回0吧。
帅得不敢出门 2008-08-30
  • 打赏
  • 举报
回复
注意结果与过程. 结果不能代表一个过程 就像 孩子能 == 生孩子 么??
帅得不敢出门 2008-08-30
  • 打赏
  • 举报
回复

你具体代码是什么?

int b = int(); //b = 0 ;
这个是调用int 的构造函数,初始为0的,所以b==0;这里返回的是结果给b
而不是说int()代表的是0值,他是一个函数

int V1(int ()); //就是這樣寫
typeid 輸出為 : int (*)( int (*)() )
也就是將參數中的 int() 解析為 int (*)()
而一開始我誤認為 int() = 0 從而解析成: int V1(0); //就錯了。想問為什麼。

----一样的道理,int()是一个函数调用,此是不能当结果0用的.
ttkk_2007 2008-08-30
  • 打赏
  • 举报
回复
int v(int a());
其中,int a()就会被解析为int (*a)(),一个函数指针,你的只不过是匿名的而已

int() = 0;我想只是给int型变量初始化的时候用的吧
herman~~ 2008-08-30
  • 打赏
  • 举报
回复
v1 函数地址
V2 函数指针,看成普通的指针指向一普通的变量地址就可以了
勉励前行 2008-08-30
  • 打赏
  • 举报
回复
int V(T); 的解析
如果 T 為一個類型,則 V 為聲明一個函數
如果 T 為一個數值,則 V 為聲明一個變量並初始化。

int () //可以解析為 0
因為支持匿名參數,又可以解析成 int A() 一個函數聲明.

問題歸結到:對於這種歧義,如何裁定,裁定准則是什麼。(總不會是由編譯器隨便定吧.)


勉励前行 2008-08-30
  • 打赏
  • 举报
回复
int GetInt() {return 100 ; }
int V(GetInt()); //是允許实调用的。也就是 int()可以解析為 0
budweiser 2008-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 PPower 的回复:]
int V1(int ()); //就是這樣寫
typeid 輸出為 :  int (*)( int (*)() )
也就是將參數中的 int() 解析為 int (*)()
而一開始我誤認為 int() = 0 從而解析成: int V1(0); //就錯了。想問為什麼。

int V() ; //是聲明了一個函數

int V(int ()) ;
//匿名參數,補全參數名後為: int V(int a()) ;
//在參數中可以“聲明參數是一個函數”,其等效於“聲明參數為一個函數指針”?
解析為 int V(int ()) --> int V(0) ; 就完全…
[/Quote]
基本上是这么回事, 但 int V(int ()); 不会解析为 int V(0), 因为这里是声明, 不管是返回值还是参数都是类型, 如果将 int () 解释为 0 , 这是实调用
wangdeqie 2008-08-30
  • 打赏
  • 举报
回复

int V1() ; //V1()的参数为无,返回值int型
int (*V2)() ; //V2所指向的函数的参数也为空,返回值也是int型
//函数指针就是这么用的,比如:
#include <typeinfo>
#include <iostream>
using namespace std;

int V1()
{
return 0;
}
int main(int argc, char *argv[])
{

int (*V2)() ;
V2=V1;
cout <<typeid(V1).name() <<endl;
cout <<typeid(V2).name() <<endl;

int a(); //a = int(*)();//函數指針
int b = int(); //b = 0 ;
}



yuwei2589 2008-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 PPower 的回复:]
在參數中可以“聲明參數是一個函數”,其等效於“聲明參數為一個函數指針”?

[/Quote]
对,在函数中,可以通过函数指针来调用函数。但是要区别下下面的两种情况:

int func1();
int (*pfunc)() = func1;

MyFunc(func1());//先调用func1,利用func1的返回值做MyFunc的参数
MyFunc(pfunc);//直接将函数地址传递给MyFunc,可以在函数中来调用。其实也可以写成MyFunc(func1);


int V1(int ()); 这个写法没怎么看明白,int是你自己定义的操作符重载函数吗?
独孤过儿 2008-08-30
  • 打赏
  • 举报
回复
因为函数名本身就是一个指向函数入口地址的指针,这里指针的含义是一个label,而不同于对象指针的pointer,所以你对这个label的一些操作

得到的结果是和对pointer的操作得到的结果是不同的...
勉励前行 2008-08-30
  • 打赏
  • 举报
回复
int V1(int ()); //就是這樣寫
typeid 輸出為 : int (*)( int (*)() )
也就是將參數中的 int() 解析為 int (*)()
而一開始我誤認為 int() = 0 從而解析成: int V1(0); //就錯了。想問為什麼。

int V() ; //是聲明了一個函數

int V(int ()) ;
//匿名參數,補全參數名後為: int V(int a()) ;
//在參數中可以“聲明參數是一個函數”,其等效於“聲明參數為一個函數指針”?
解析為 int V(int ()) --> int V(0) ; 就完全不一樣了。

yuwei2589 2008-08-30
  • 打赏
  • 举报
回复
int V1(int ());
能写详细点吗?
看不很明白!不知道你的函数V1里的参数是强制转换还是什么?
勉励前行 2008-08-30
  • 打赏
  • 举报
回复
int V1(int ()); // 參數 int () 解析為 int(*)()
為什麼不解析為 int() = 0 呢
int V1(int ()) = int V1(0) ; //這樣的解析過程錯了,為什麼。
勉励前行 2008-08-30
  • 打赏
  • 举报
回复
template <typename T>
T GetZeroValue()
{
T v(); //改成 T v = T() ; 才行。
return v ;
}
//這樣的模板錯了。
int V1() ; //聲明一個函數。
std::string str(); //同樣為聲明一個函數

默認構造函數要明確調用。好象有些明白了。
勉励前行 2008-08-30
  • 打赏
  • 举报
回复
int V1(int ());
// 參數 int () 解析為 int(*)()
為什麼不解析為 int() = 0 呢
yuwei2589 2008-08-30
  • 打赏
  • 举报
回复

int V1() ; //V1表示的是函数名,也即是函数的起始地址
int (*V2)() ; //V2代表函数指针,指向一个返回值为int,参数为空的函数

表示的都是函数的地址。
所以楼主这么做,自然返回是一样的类型。
加载更多回复(2)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧