通过类型别名实现 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
使用 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