Init
This commit is contained in:
167
cppdraft/over/oper/general.md
Normal file
167
cppdraft/over/oper/general.md
Normal file
@@ -0,0 +1,167 @@
|
||||
[over.oper.general]
|
||||
|
||||
# 12 Overloading [[over]](./#over)
|
||||
|
||||
## 12.4 Overloaded operators [[over.oper]](over.oper#general)
|
||||
|
||||
### 12.4.1 General [over.oper.general]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3338)
|
||||
|
||||
A declaration
|
||||
whose [*declarator-id*](dcl.decl.general#nt:declarator-id "9.3.1 General [dcl.decl.general]") is an [*operator-function-id*](#nt:operator-function-id "12.4.1 General [over.oper.general]") shall declare a function or function template or
|
||||
an explicit instantiation or specialization of a function template[.](#1.sentence-1)
|
||||
|
||||
A function so declared is an [*operator function*](#def:function,operator "12.4.1 General [over.oper.general]")[.](#1.sentence-2)
|
||||
|
||||
A function template so declared is
|
||||
an [*operator function template*](#def:function,operator,template "12.4.1 General [over.oper.general]")[.](#1.sentence-3)
|
||||
|
||||
A specialization of an operator function template is also an operator function[.](#1.sentence-4)
|
||||
|
||||
An operator function is said to[*implement*](#def:operator,implementation "12.4.1 General [over.oper.general]") the operator named in its[*operator-function-id*](#nt:operator-function-id "12.4.1 General [over.oper.general]")[.](#1.sentence-5)
|
||||
|
||||
[operator-function-id:](#nt:operator-function-id "12.4.1 General [over.oper.general]")
|
||||
operator [*operator*](#nt:operator "12.4.1 General [over.oper.general]")
|
||||
|
||||
[operator:](#nt:operator "12.4.1 General [over.oper.general]") one of
|
||||
new delete new[] delete[] co_await ( ) [ ] -> ->*
|
||||
~ ! + - * / % ^ &
|
||||
| = += -= *= /= %= ^= &=
|
||||
|= == != < > <= >= <=> &&
|
||||
|| << >> <<= >>= ++ -- ,
|
||||
|
||||
[*Note [1](#note-1)*:
|
||||
|
||||
The operatorsnew[],delete[],(),
|
||||
and[] are formed from more than one token[.](#1.sentence-6)
|
||||
|
||||
The latter two operators are [function call](expr.call "7.6.1.3 Function call [expr.call]") and [subscripting](expr.sub "7.6.1.2 Subscripting [expr.sub]")[.](#1.sentence-7)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3382)
|
||||
|
||||
Both the unary and binary forms of
|
||||
|
||||
+ - * &
|
||||
|
||||
can be overloaded[.](#2.sentence-1)
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3389)
|
||||
|
||||
[*Note [2](#note-2)*:
|
||||
|
||||
The following operators cannot be overloaded:
|
||||
|
||||
. .* :: ?:
|
||||
|
||||
nor can the preprocessing symbols# ([[cpp.stringize]](cpp.stringize "15.7.3 The # operator"))
|
||||
and## ([[cpp.concat]](cpp.concat "15.7.4 The ## operator"))[.](#3.sentence-1)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3402)
|
||||
|
||||
Operator functions are usually not called directly; instead they are invoked
|
||||
to evaluate the operators they implement ([[over.unary]](over.unary "12.4.2 Unary operators") â [[over.inc]](over.inc "12.4.7 Increment and decrement"))[.](#4.sentence-1)
|
||||
|
||||
They can be explicitly called, however, using the[*operator-function-id*](#nt:operator-function-id "12.4.1 General [over.oper.general]") as the name of the function in the function call syntax ([[expr.call]](expr.call "7.6.1.3 Function call"))[.](#4.sentence-2)
|
||||
|
||||
[*Example [1](#example-1)*: complex z = a.operator+(b); // complex z = a+b;void* p = operator new(sizeof(int)*n); â *end example*]
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3416)
|
||||
|
||||
The allocation and deallocation functions,operator new,operator new[],operator delete, andoperator delete[],
|
||||
are described completely in [[basic.stc.dynamic]](basic.stc.dynamic "6.8.6.5 Dynamic storage duration")[.](#5.sentence-1)
|
||||
|
||||
The attributes and restrictions
|
||||
found in the rest of [[over.oper]](over.oper "12.4 Overloaded operators") do not apply to them unless explicitly
|
||||
stated in [[basic.stc.dynamic]](basic.stc.dynamic "6.8.6.5 Dynamic storage duration")[.](#5.sentence-2)
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3427)
|
||||
|
||||
The co_await operator is described completely in [[expr.await]](expr.await "7.6.2.4 Await")[.](#6.sentence-1)
|
||||
|
||||
The attributes and restrictions
|
||||
found in the rest of [[over.oper]](over.oper "12.4 Overloaded operators") do not apply to it unless explicitly
|
||||
stated in [[expr.await]](expr.await "7.6.2.4 Await")[.](#6.sentence-2)
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3433)
|
||||
|
||||
An operator function
|
||||
shall have at least one
|
||||
function parameter or implicit object parameter whose type is
|
||||
a class, a reference to a class, an
|
||||
enumeration, or a reference to an enumeration[.](#7.sentence-1)
|
||||
|
||||
It is not possible to change the precedence, grouping, or number of operands
|
||||
of operators[.](#7.sentence-2)
|
||||
|
||||
The meaning of
|
||||
the operators =, (unary) &, and , (comma),
|
||||
predefined for each type, can be changed for specific class types by
|
||||
defining operator functions that implement these operators[.](#7.sentence-3)
|
||||
|
||||
Likewise, the meaning of the operators (unary) & and , (comma)
|
||||
can be changed for specific enumeration types[.](#7.sentence-4)
|
||||
|
||||
Operator functions are inherited in the same manner as other base class
|
||||
functions[.](#7.sentence-5)
|
||||
|
||||
[8](#8)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3452)
|
||||
|
||||
An operator function shall be a
|
||||
prefix unary, binary, function call, subscripting, class member access, increment, or decrement
|
||||
operator function[.](#8.sentence-1)
|
||||
|
||||
[9](#9)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3457)
|
||||
|
||||
[*Note [3](#note-3)*:
|
||||
|
||||
The identities among certain predefined operators applied to fundamental types
|
||||
(for example,++a ≡a+=1)
|
||||
need not hold for operator functions[.](#9.sentence-1)
|
||||
|
||||
Some predefined operators, such as+=,
|
||||
require an operand to be an lvalue when applied to fundamental types;
|
||||
this is not required by operator functions[.](#9.sentence-2)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[10](#10)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3471)
|
||||
|
||||
An operator function cannot have [default arguments](dcl.fct.default "9.3.4.7 Default arguments [dcl.fct.default]"),
|
||||
except where explicitly stated below[.](#10.sentence-1)
|
||||
|
||||
Operator
|
||||
functions cannot have more or fewer parameters than the
|
||||
number required for the corresponding operator, as
|
||||
described in the rest of [[over.oper]](over.oper "12.4 Overloaded operators")[.](#10.sentence-2)
|
||||
|
||||
[11](#11)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/overloading.tex#L3480)
|
||||
|
||||
Operators not mentioned explicitly in subclauses [[over.assign]](over.assign "12.4.3.2 Simple assignment") through [[over.inc]](over.inc "12.4.7 Increment and decrement") act as ordinary unary and binary
|
||||
operators obeying the rules of [[over.unary]](over.unary "12.4.2 Unary operators") or [[over.binary]](over.binary "12.4.3 Binary operators")[.](#11.sentence-1)
|
||||
Reference in New Issue
Block a user