[英]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
}
};
它工作正常。
所以,我有一個問題:
- 為什么不允許數組下標運算符的默認參數?
- 為什么允許函數調用運算符的默認參數?
主要是因為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 )
大括號的參數是可選的,括號的參數不是。 正如評論中所建議的那樣,請注意,括號只需要一個參數,而大括號可以采用任意數量的參數。
還要考慮宋元堯對標准明確陳述的回答。
我想你真的在問為什么標准允許一個而不是另一個。 原因主要是與人們的期望有關 ,而不是在一個案例中排除違約的一些技術邏輯而不是另一個案例中的違約:
這是人們期望[]運算符意味着什么的問題。 通常它意味着“獲取[...]元素”,我們使用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.