Chain member initializers

Viewed 46

Is it possible to refer to class members inside "in class initializers"?

Example:

struct Example
{
  std::string a = "Hello";
  std::string b = a + "World";
};

It seems to work (compiles and runs) but is it ok to do?

2 Answers
#include<bits/stdc++.h>
using namespace std;
struct Example
{
  string a = "Hello";
  string b = a + "World";
};
int main(){
    Example val ;
    val.a = "Salom";
    cout<<val.a<<" "<<val.b; 
}

it is okey, you can do it .

but captures the initial result you have If you give a a new value b will not be updated

enter image description here

This is allowed in default initializers since C++11. Scroll down to the "Usage" section and look at the first example. I copied the explanation and example here for easier reference:

The name of a non-static data member or a non-static member function can only appear in the following three situations:

  1. As a part of class member access expression, in which the class either has this member or is derived from a class that has this member, including the implicit this-> member access expressions that appear when a non-static member name is used in any of the contexts where this is allowed (inside member function bodies, in member initializer lists, in the in-class default member initializers).
struct S
{
    int m;
    int n;
    int x = m;            // OK: implicit this-> allowed in default initializers (C++11)
    S(int i) : m(i), n(m) // OK: implicit this-> allowed in member initializer lists
    {
        this->f();        // explicit member access expression
        f();              // implicit this-> allowed in member function bodies
    }
    void f();
};
Related