簡體   English   中英

這個陳述在C ++ 11標准中的含義是什么?

[英]What is the meaning of this statement in the C++11 Standard?

從C ++ 11標准的第5.2.2 / 1段中提取的句子中粗體字符是什么意思?

函數調用有兩種:普通函數調用和成員函數(9.3)調用。 函數調用是后綴表達式,后跟括號,其中包含可能為空的逗號分隔的表達式列表,這些表達式構成函數的參數。 對於普通函數調用,后綴表達式應該是引用函數的左值(在這種情況下,函數到指針標准轉換(4.3)在后綴表達式上被抑制),或者它應該具有指向函數類型的指針

編輯

基本上我要問的是:當標准說“(在這種情況下,函數到指針標准轉換在后綴表達式上被抑制)”這是否意味着這種抑制是好的或者它將在以后被撤銷(例如,在函數重載之后)?

EDIT1

在我看來,上面的“抑制”一詞具有誤導性,因為它給人的印象是,從函數名到函數指針的轉換可能永遠不會被編譯器完成。 我相信情況並非如此。 這個轉換將始終在函數重載過程完成后發生,因為只有在這一點上,編譯器才能確切地知道要調用哪個函數。 程序初始化函數指針時不是這種情況。 在這種情況下,編譯器知道要調用的函數,因此不會出現重載,如下例所示。

#include <iostream>
int foo(int i) { std::cout << "int" << '\n'; return i * i; }
double foo(double d) { std::cout << "double" << '\n'; return d * d; }

int main()
{
    int(*pf)(int) = foo;                //  no overloading here!
    std::cout << pf(10.) << '\n';       //  calls foo(int)
    std::cout << foo(10.) << '\n';      //  call foo(double) after function overloading. Therefore, only after function
                                        //  overloading is finished, the function name foo() is converted into a function-pointer.
}

代碼打印:

INT
100

100

對於普通函數調用,后綴表達式應該是引用函數的左值(在這種情況下,函數到指針標准轉換(4.3)在后綴表達式上被抑制),或者它應該具有指向函數類型的指針。

因此,“后綴表達式”在5.2 / 1中定義...它是一個語法元素,並不一定意味着“ x++ ”類型的后綴......看看列表本身。 基本上,關鍵是有一個表達式:

  • “應該是引用函數的左值(在這種情況下,后綴表達式上的函數到指針標准轉換(4.3)被抑制)”

這意味着表達式實際上是函數的標識符,或類似(x ? fn1 : fn2) 它不需要轉換為指針 - 編譯器已經知道如何調用函數。

(值得注意的是它必須不進行轉換的原因是運算符優先級 - 特別是后綴++--()用於函數調用, [] , .->都具有相同的優先級和從左到右的關聯性,因此例如[1]f(1,2,3)被視為[1](f(1,2,3))因為它是唯一的解析匹配,而如果發生衰減,則從左到右關聯性將其視為([1]f)(1,2,3) 。)

  • “或者它應該有指向功能類型的指針。”

所以,你也可以提供一個函數指針。

如果沒有相反的標准中的任何陳述,抑制可能是永久性的。 我認為轉換被抑制了,因為(i)需要進行重載解決,(ii)在這種情況下沒有必要。 實際上,在我們確切地知道正在調用哪個函數之前,不可能轉換為指針。 重載解析后,我們知道我們直接調用該函數,因此轉換將毫無意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM