[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)
