2011-12-20 33 views
3

函數類型(左值)可以轉換爲指向函數(右值)的指針。對指向函數轉換的指針的澄清

int func(); 
int (*func_ptr)() = func; 

但是,從(4.1/1)

非函數的左值(3.10),非陣列類型T可以被轉換到 右值。

這是否意味着一個左值右值轉換沒有在函數上完成?此外,當一個數組衰減指針不會返回一個指針的右值嗎?

回答

3

函數是左值。指向函數的指針(數據類型)也可以是 ;如果你給它一個名字,這是一個左值;否則,它不是 (粗略地說)。指向函數的指針遵守所有通常的左值 來轉換規則。對於基本類型或 指針等簡單類型,左值到右值的轉換基本上意味着讀取 變量。

void func();   // Declares func 
(*(&func))();   // The expression &func is an rvalue 
void (*pf)() = &func; // pf is an lvalue 
(*pf)();    // In the expression *pf, pf undergoes an 
         // lvalue to rvalue conversion 

注意,這裏的功能的隱式轉換指針 功能,並且該()操作符對函數和 函數指針,所以最後兩行可以寫成:

void (*pf)() = func; 
pf(); 

一如既往,轉換的結果是一個右值(除非 轉換爲引用類型)。當數組 隱式轉換爲指針時也是如此;數組和函數都只能存在 作爲左值,但是它們都隱式地轉換爲一個指針, 這是一個右值。但是該指針可用於初始化適當指針類型的變量 ;這些變量是左值。

+0

我明白了,所以結果只不過是一個地址,並不意味着你讀了一些價值。對? – user1086635 2011-12-20 11:23:38

+0

結果是什麼?函數轉換爲指針的結果是一個值,即函數的地址。它在內存中沒有地址(這是左值的一個特性)。 – 2011-12-20 11:30:33

+0

函數func的結果是一個右值,它是一個地址,但不是從非函數或非數組類型返回的右值的意義上,這就是爲什麼(4.1/1)中的語句的原因,對嗎? – user1086635 2011-12-20 11:39:05