Files
2025-10-25 03:02:53 +03:00

74 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[conv.ptr]
# 7 Expressions [[expr]](./#expr)
## 7.3 Standard conversions [[conv]](conv#ptr)
### 7.3.12 Pointer conversions [conv.ptr]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L1022)
A [*null pointer constant*](#def:constant,null_pointer "7.3.12Pointer conversions[conv.ptr]") is an integer literal ([[lex.icon]](lex.icon "5.13.2Integer literals")) with
value zero
or a prvalue of type std::nullptr_t[.](#1.sentence-1)
A null pointer constant can be
converted to a pointer type; the
result is the null pointer value of that type ([[basic.compound]](basic.compound "6.9.4Compound types")) and is
distinguishable from every other value of
object pointer or function pointer
type[.](#1.sentence-2)
Such a conversion is called a [*null pointer conversion*](#def:conversion,null_pointer "7.3.12Pointer conversions[conv.ptr]")[.](#1.sentence-3)
The conversion of a null pointer constant to a pointer to
cv-qualified type is a single conversion, and not the sequence of a
pointer conversion followed by a qualification
conversion ([[conv.qual]](conv.qual "7.3.6Qualification conversions"))[.](#1.sentence-4)
A null pointer constant of integral type
can be converted to a prvalue of type std::nullptr_t[.](#1.sentence-5)
[*Note [1](#note-1)*:
The resulting prvalue is not a null pointer value[.](#1.sentence-6)
— *end note*]
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L1045)
A prvalue of type “pointer to cv T”, where T is an object type, can be converted to a prvalue of type “pointer tocv void”[.](#2.sentence-1)
The pointer value ([[basic.compound]](basic.compound "6.9.4Compound types")) is unchanged by this conversion[.](#2.sentence-2)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L1051)
A prvalue v of type “pointer to cv D”, where D is a complete class type, can be converted to a prvalue of type “pointer tocv B”, where B is a base class ([[class.derived]](class.derived "11.7Derived classes"))
of D[.](#3.sentence-1)
If B is an
inaccessible ([[class.access]](class.access "11.8Member access control")) or
ambiguous ([[class.member.lookup]](class.member.lookup "6.5.2Member name lookup")) base class of D, a program
that necessitates this conversion is ill-formed[.](#3.sentence-2)
If v is a null pointer value,
the result is a null pointer value[.](#3.sentence-3)
Otherwise,
if B is a virtual base class of D andv does not point to an object
whose type is similar ([[conv.qual]](conv.qual "7.3.6Qualification conversions")) to D and
that is
within its lifetime or
within its period of construction or destruction ([[class.cdtor]](class.cdtor "11.9.5Construction and destruction")),
the behavior is undefined[.](#3.sentence-4)
Otherwise,
the result is a pointer to the base class subobject of
the derived class object[.](#3.sentence-5)