94 lines
3.6 KiB
Markdown
94 lines
3.6 KiB
Markdown
[temp.deduct.conv]
|
||
|
||
# 13 Templates [[temp]](./#temp)
|
||
|
||
## 13.10 Function template specializations [[temp.fct.spec]](temp.fct.spec#temp.deduct.conv)
|
||
|
||
### 13.10.3 Template argument deduction [[temp.deduct]](temp.deduct#conv)
|
||
|
||
#### 13.10.3.4 Deducing conversion function template arguments [temp.deduct.conv]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/templates.tex#L8494)
|
||
|
||
Template argument deduction is done by comparing the return type of
|
||
the
|
||
conversion function template
|
||
(call itP)
|
||
with the type specified by the [*conversion-type-id*](class.conv.fct#nt:conversion-type-id "11.4.8.3 Conversion functions [class.conv.fct]") of the[*conversion-function-id*](class.conv.fct#nt:conversion-function-id "11.4.8.3 Conversion functions [class.conv.fct]") being looked up
|
||
(call it A) as described in [[temp.deduct.type]](temp.deduct.type "13.10.3.6 Deducing template arguments from a type")[.](#1.sentence-1)
|
||
|
||
If the [*conversion-function-id*](class.conv.fct#nt:conversion-function-id "11.4.8.3 Conversion functions [class.conv.fct]") is constructed during
|
||
overload resolution ([[over.match.funcs]](over.match.funcs "12.2.2 Candidate functions and argument lists")),
|
||
the rules in the remainder of this subclause apply[.](#1.sentence-2)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/templates.tex#L8507)
|
||
|
||
If P is a reference type, the type referred to by P is used in place
|
||
of P for type deduction and for any further references to or transformations ofP in the remainder of this subclause[.](#2.sentence-1)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/templates.tex#L8512)
|
||
|
||
IfA is not a reference type:
|
||
|
||
- [(3.1)](#3.1)
|
||
|
||
IfP is an array type, the pointer type produced by the[array-to-pointer standard conversion](conv.array "7.3.3 Array-to-pointer conversion [conv.array]") is used in place ofP for type
|
||
deduction; otherwise,
|
||
|
||
- [(3.2)](#3.2)
|
||
|
||
IfP is a function type, the pointer type produced by the[function-to-pointer standard conversion](conv.func "7.3.4 Function-to-pointer conversion [conv.func]") is used in place ofP for
|
||
type deduction; otherwise,
|
||
|
||
- [(3.3)](#3.3)
|
||
|
||
IfP is a cv-qualified type, the top-level cv-qualifiers ofP's
|
||
type are ignored for type deduction[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/templates.tex#L8541)
|
||
|
||
IfA is a cv-qualified type, the top-level cv-qualifiers ofA's
|
||
type are ignored for type deduction[.](#4.sentence-1)
|
||
|
||
IfA is a
|
||
reference type, the type referred to byA is used for type deduction[.](#4.sentence-2)
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/templates.tex#L8554)
|
||
|
||
In general, the deduction process attempts to find template argument
|
||
values that will make the deducedA identical toA[.](#5.sentence-1)
|
||
|
||
However, certain attributes of A may be ignored:
|
||
|
||
- [(5.1)](#5.1)
|
||
|
||
If the original A is a reference type,
|
||
any cv-qualifiers of A (i.e., the type referred to by the reference)[.](#5.1.sentence-1)
|
||
|
||
- [(5.2)](#5.2)
|
||
|
||
If the original A is
|
||
a function pointer or pointer-to-member-function type
|
||
with a potentially-throwing exception specification ([[except.spec]](except.spec "14.5 Exception specifications")),
|
||
the exception specification[.](#5.2.sentence-1)
|
||
|
||
- [(5.3)](#5.3)
|
||
|
||
Any cv-qualifiers in A that can be restored by a qualification conversion[.](#5.3.sentence-1)
|
||
|
||
These attributes are ignored only if type deduction would
|
||
otherwise fail[.](#5.sentence-3)
|
||
|
||
If ignoring them allows more than one possible deducedA,
|
||
the type deduction fails[.](#5.sentence-4)
|