In addition to the arithmetic conversions, there are several additional kinds of implicit conversions. These include:
Array to Pointer Conversions: In most expressions, when we use an array, the array is automatically converted to a pointer to the first element in that array:
int ia[10]; // array of ten ints
int* ip = ia; // convert ia to a pointer to the first element
This conversion is not performed when an array is used with decltype
or as the operand of the address-of (&
), sizeof
, or typeid
(which we’ll cover in § 19.2.2 (p. 826)) operators. The conversion is also omitted when we initialize a reference to an array (§ 3.5.1, p. 114). As we’ll see in § 6.7 (p. 247), a similar pointer conversion happens when we use a function type in an expression.
Pointer Conversions: There are several other pointer conversions: A constant integral value of 0 and the literal nullptr
can be converted to any pointer type; a pointer to any nonconst
type can be converted to void*
, and a pointer to any type can be converted to a const void*
. We’ll see in § 15.2.2 (p. 597) that there is an additional pointer conversion that applies to types related by inheritance.
Conversions to bool:
There is an automatic conversion from arithmetic or pointer types to bool
. If the pointer or arithmetic value is zero, the conversion yields false;
any other value yields true
:
char *cp = get_string();
if (cp) /* ... */ // true if the pointer cp is not zero
while (*cp) /* ... */ // true if *cp is not the null character
Conversion to const:
We can convert a pointer to a nonconst
type to a pointer to the corresponding const
type, and similarly for references. That is, if T
is a type, we can convert a pointer or a reference to T
into a pointer or reference to const T
, respectively (§ 2.4.1, p. 61, and § 2.4.2, p. 62):
int i;
const int &j = i; // convert a nonconst to a reference to const int
const int *p = &i; // convert address of a nonconst to the address of a const
int &r = j, *q = p; // error: conversion from const to nonconst not allowed
The reverse conversion—removing a low-level const
—does not exist.
Conversions Defined by Class Types: Class types can define conversions that the compiler will apply automatically. The compiler will apply only one class-type conversion at a time. In § 7.5.4 (p. 295) we’ll see an example of when multiple conversions might be required, and will be rejected.
Our programs have already used class-type conversions: We use a class-type conversion when we use a C-style character string where a library string
is expected (§ 3.5.5, p. 124) and when we read from an istream
in a condition:
string s, t = "a value"; // character string literal converted to type string
while (cin >> s) // while condition converts cin to bool
The condition (cin >> s
) reads cin
and yields cin
as its result. Conditions expect a value of type bool
, but this condition tests a value of type istream
. The IO library defines a conversion from istream
to bool
. That conversion is used (automatically) to convert cin
to bool
. The resulting bool
value depends on the state of the stream. If the last read succeeded, then the conversion yields true
. If the last attempt failed, then the conversion to bool
yields false
.
18.119.138.202