[over.sub] # 12 Overloading [[over]](./#over) ## 12.4 Overloaded operators [[over.oper]](over.oper#over.sub) ### 12.4.5 Subscripting [over.sub] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3650) A [*subscripting operator function*](#def:operator_function,subscripting "12.4.5 Subscripting [over.sub]") is a member function named operator[] with an arbitrary number of parameters[.](#1.sentence-1) It may have default arguments[.](#1.sentence-2) For an expression of the form [*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1 General [expr.post.general]") [ [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1 General [expr.post.general]")opt ] the operator function is selected by overload resolution ([[over.match.oper]](over.match.oper "12.2.2.3 Operators in expressions"))[.](#1.sentence-3) If a member function is selected, the expression is interpreted as [*postfix-expression*](expr.post.general#nt:postfix-expression "7.6.1.1 General [expr.post.general]") . operator [] ( [*expression-list*](expr.post.general#nt:expression-list "7.6.1.1 General [expr.post.general]")opt ) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3667) [*Example [1](#example-1)*: struct X { Z operator[](std::initializer_list); Z operator[](auto...);}; X x; x[{1,2,3}] = 7; // OK, meaning x.operator[]({1,2,3}) x[1,2,3] = 7; // OK, meaning x.operator[](1,2,3)int a[10]; a[{1,2,3}] = 7; // error: built-in subscript operator a[1,2,3] = 7; // error: built-in subscript operator — *end example*]