This check warns when structs or classes that are copyable or movable, and have const-qualified or reference (lvalue or rvalue) data members. Having such members is rarely useful, and makes the class only copy-constructible but not copy-assignable.


// Bad, const-qualified member
struct Const {
  const int x;

// Good:
class Foo {
  int get() const { return x; }
  int x;

// Bad, lvalue reference member
struct Ref {
  int& x;

// Good:
struct Foo {
  int* x;
  std::unique_ptr<int> x;
  std::shared_ptr<int> x;
  gsl::not_null<int> x;

// Bad, rvalue reference member
struct RefRef {
  int&& x;

This check implements C.12 from the C++ Core Guidelines.

Further reading: Data members: Never const.