I am learning about member initializer lists in C++. So consider the following example:
struct Person
{
public:
Person(int pAge): age(pAge)
// ^^^^^^^^^ is this member initializer formally part of the constructor body?
{
}
private:
int age = 0;
};
My first question is that is the member initializer age(pAge)
formally part of the constructor's body. I mean i've read that a function's body starts from the opening {
and end at the closing }
. To my current understanding, there are four things involved here:
//this whole thing is ctor definition
Person(int pAge): age(pAge)
{
}
Member initializer: This is the age(pAge)
part.
Ctor declaration: This is the Person(int pAge)
part.
Ctor's body: This is the region between the opening {
and the closing }
.
My second question is that is the above given description correct? If not then what should be the correct meaning of those four terms according to the C++ standard: Ctor definition, Member initializer, Ctor declaration and Ctor's body.
PS: I've read this post which doesn't answer my question.
As per [dcl.fct.def.general], which tells us the grammar of a function definition, a ctor-initializer is part of the function-body:
function-definition: [...] function-body function-body: ctor-initializer_opt compound-statement
The compound-statement, as per [stmt.block], is, in this context, what OP refers to as "within braces" (block):
A compound statement (also known as a block) groups a sequence of statements into a single statement.
compound-statement: { statement-seq_opt }
Whereas ctor-initializer, as per [class.base.init], is particularly allowed only for the special kind of functions that are constructors [emphasis mine]:
In the definition of a constructor for a class, initializers for direct and virtual base class subobjects and non-static data members can be specified by a ctor-initializer, which has the form
ctor-initializer: : mem-initializer-list
With this, we can answer the OP's questions.
Is member initializer list considered part of the body of a constructor or it it considered part of the declarator
Yes, as per the above the member initializer, formally mem-initializer-list, is part of the function-body of the constructor.
My second question is that is the above given description correct?
1. Ctor definition: This includes the whole
//this whole thing is ctor definition Person(int pAge): age(pAge) { }
Correct.
2. Member initializer: This is the
age(pAge)
part.
Correct, formally the mem-initializer-list (whereas : age(pAge)
is the ctor-initializer
3. Ctor declaration: This is the
Person(int pAge)
part.
Not entirely correct: a definition is also a declaration. [dcl.fct] describe the rules of function declarations, and in simple terms, Person(int pAge);
is a declaration that is not a definition, particularly here by omission of a function-body.
4. Ctor's body: This is the region between the opening
{
and the closing}
.
Incorrect. The body of a function, as covered above, container also, optionally, a ctor-initializer. In OP's example, : age(pAge) {}
is the function-body of the constructor.