If I define the destructor (or any autogenerated constructor) as default like this:
struct A {
~A() = default;
};
And then include this in several translation units, does this break the ODR? Can someone walk me through the steps at on the ODR page? Because i am struggling to understand if the compiler generated destructor will be inline or some other effect to prevent it from breaking the ODR.
No ODR violation. Member functions are implicitly inline if they are defined, defaulted or deleted inside a class definition.
https://en.cppreference.com/w/cpp/language/inline
The implicitly-generated member functions and any member function declared as defaulted on its first declaration are inline just like any other function defined inside a class definition.
// header file
// OK, implicit inline
struct A {
~A() {}
};
// header file
// OK, implicit inline
struct A {
~A() = default;
};
// header file
struct A {
~A();
};
// NOT ok, ODR violation when header is included in more than 1 TU
A::~A() {};
// header file
struct A {
~A();
};
// NOT ok, ODR violation when header is included in more than 1 TU
A::~A() = default;