struct Bar
{
Bar() {}
};
struct Foo
{
Foo() = default;
Bar m_bar;
};
int main()
{
Foo foo;
}
When using C++11 default
You can ignore or suppress the warning. This is a misinterpretation of one of the Effective C++ guidelines. The guideline says to prefer initialisation to assignment, but in your example, m_bar
will be initialised. Your code is correct.
Source: Jonathan Wakely in GCC's bug tracker:
# Item 12: Prefer initialization to assignment in constructors.
Replaced by Item 4: "Make sure that objects are initialized before they're used", and G++ misinterprets the original item anyway and warns about any member without a mem-initializer, which is very annoying: there's no point initializing a std::string, it has a perfectly safe default constructor. My -Wmeminit patch for PR 2972 should replace the current warning for this item, as it only warns about members left uninitialized by the constructor.
(And as it's a known issue, there's no need to report it as a bug again.)
Is it alright to ignore this warning? Yes.
Is it a good idea to ignore this warning? Depends(*)
Should you file a bug to gcc? No(*)
(*)
default
constructor in fact initialises m_bar
just fine, you can test thatman g++
, section -Weffc++
Warn about violations of the following style guidelines from Scott Meyers’ Effective C++ book:
- Item 11: Define a copy constructor and an assignment operator for classes with dynamically allocated memory.
- Item 12: Prefer initialization to assignment in constructors.
- Item 14: Make destructors virtual in base classes.
- Item 15: Have "operator=" return a reference to *this.
- Item 23: Don’t try to return a reference when you must return an object.
Also warn about violations of the following style guidelines from Scott Meyers’ More Effective C++ book:
- Item 6: Distinguish between prefix and postfix forms of increment and decrement operators.
- Item 7: Never overload "&&", "││", or ",".
When selecting this option, be aware that the standard library headers do not obey all of these guidelines.