Functions that invoke other ``++inline++`` functions often become too complex to actually be ``++inline++``d, despite the fact that they appear to be small. This problem is especially common with constructors and destructors. 


A constructor always invokes the constructors of its base classes and member data before executing its own code. 


Code that does not try to ``++inline++`` constructors and destructors, is more portable because it can be handled by compilers that get confused when generating complex nested ``++inline++`` functions.


== Noncompliant Code Example

----
class String
{
  private:
    // ...
  public:
    String();
    ~String();
  };

  inline String::String()      //Noncompliant
  {
    // ...
  }
  inline String::~String()     //Noncompliant
  {
    // ...
  }
}
----


== Compliant Solution

----
class String
{
  private:
    // ...
  public:
    String();
    ~String();
  };

  String::String()
  {
    // ...
  }
  String::~String()
  {
    // ...
  }
}
----

