簡體   English   中英

為下標運算符提供默認的 arguments 和 function 調用運算符

[英]Provide default arguments for subscript operator and function call operator

在下面的代碼中,我為數組下標運算符提供了默認值 arguments

struct st 
{
    int operator[](int x = 0)
    {
        // code here
    }
};

但是,編譯器產生了一個錯誤:

error: 'int st::operator[](int)' cannot have default arguments
     int operator[](int x = 0)

但是,如果我為function 呼叫運營商提供默認 arguments。

struct st 
{
    int operator()(int x = 0)
    {
        // code here
    }
};

它工作正常。

所以,我有一個問題:

  • 為什么數組下標運算符不允許默認值 arguments?
  • 為什么 function 呼叫運營商允許默認 arguments?
  • 為什么不允許數組下標運算符的默認參數?
  • 為什么允許函數調用運算符的默認參數?

主要是因為C ++語法這么說。 根據A.4 [gram.expr]:

 postfix-expression --> postfix-expression [ expr-or-braced-init-list ] --> postfix-expression ( expression-list opt ) --> simple-type-specifier (expression-list opt) --> typename-specifier ( expression-list opt ) 

大括號的參數是可選的,括號的參數不是。 正如評論中所建議的那樣,請注意,括號只需要一個參數,而大括號可以采用任意數量的參數。

還要考慮宋元堯對標准明確陳述的回答。

該標准非常明確地說明了這一點

標運算符的運算 符重載中不允許使用默認參數。

除非下面明確說明,否則運算符函數不能具有默認參數。 運算符函數的參數不能超過相應運算符所需的數量,如本子條款的其余部分所述。

operator[]應該是一個非靜態成員函數,只有一個參數。

而對於函數調用運算符

operator()應該是一個具有任意數量參數的非靜態成員函數。 它可以有默認參數。

重載運算符嘗試遵循內置運算符的相同行為; 使用內置的下標運算符總是需要(只有一個)索引,它沒有默認參數 然后,不允許重載的運算符具有默認參數。 另一方面,函數總是可以接受任意數量的參數並具有默認參數。

我想你真的在問為什么標准允許一個而不是另一個。 原因主要是與人們的期望有關 ,而不是在一個案例中排除違約的一些技術邏輯而不是另一個案例中的違約:

這是人們期望[]運算符意味着什么的問題。 通常它意味着“獲取[...]元素”,我們使用int或其他類型來對集合成員進行特定查詢。 我們總是對詢問特定成員感興趣,並始終考慮到特定的查詢。

現在考慮默認參數的含義。 通常它意味着“你可以指定這個,但如果不是,我會假設這個默認值”。 這對某些功能非常有用,人們已經習慣了。

改變這一點可能會讓很多人在看到int x = vec[]

運算符(包括用戶定義類型和內置類型的重載)旨在讓人們使用從數學,邏輯和一般用法中熟悉的符號(盡管<<>>已將雙重服務視為流媒體運營商,並且符號表示妥協考慮到計算機附近普遍可用的有限字符,必須進行制作。 轉向並允許直觀的,熟悉的符號(如隱含的參數)的變化似乎適得其反。

operator()是不同的,因為它在那里抽象出“調用”(通過)一個對象和調用一個硬編碼函數之間的差異 - 它需要支持默認參數來正確地做到這一點。

自 C++23 ( https://eel.is/c++draft/over.sub ) 以來,您可以擁有數組訂閱運算符的默認參數

用戶定義類的重載下標運算符現在將具有與定義調用運算符相同的語義。 因此,您可以有 0、1、2 或多個參數。

struct st 
{
    int operator[](int x = 0)
    {
        // code here
    }
};

st obj { /* ... */ };
obj[]

現在有效。

不幸的是,沒有編譯器支持此功能,因為這是批准的最新功能。

暫無
暫無

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

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