通过类型别名实现 C++ 不变性

C++ Immutability through a type alias

使用 using 声明来创建类型的不可变版本是错误的、好的还是好的做法?

struct MutableA
{
  int i;
  float f;
};

using ImmutableA = const MutableA;

对于指针或 ref 成员,像 propagate_const 这样的包装器将确保 Immutable 对象中的 const 安全。

这样做的好处是,将 Mutable 类型转换为 Immutable 类型(我假设)不需要任何成本,并且可以避免代码重复。

这是一个好习惯吗?这是错的吗 ?没用吗?

当然,它只是试图让事情更具表现力。表达代码是 Good(TM)。

不过,最重要的是,我会注意到 const 并不意味着 immutable

这是一个示例:

using ImmutableString = std::string const;
std::string s = "Hello world";

ImmutableString& helloWorld = s;
s = "Bye!";

std::cout << helloWorld; // prints Bye!

另一个角度是:

struct X {
     mutable int i;
};

using ImmutableX = X const;

ImmutableX x { 42 };
x.i = 666; // no problem

最后,关于:

struct X {
     int i;
};

using ImmutableX = X const;

ImmutableX* p = new ImmutableX{42};

// now p->i = 666; is not OK, because it's const

delete p; // whoops, not so immutable after all?

这里可能有更多背景信息:Difference between immutable and const