C++ C++;通过类型别名的不变性
使用C++ C++;通过类型别名的不变性,c++,immutability,using-declaration,C++,Immutability,Using Declaration,使用使用声明生成类型的不可变版本是错误的、正确的还是良好的做法 struct MutableA { int i; float f; }; using ImmutableA = const MutableA; 对于指针或ref成员,像这样的包装器可以确保不可变对象中的常量安全 这样做的好处是,将可变类型转换为不可变类型(我认为)不会产生任何成本,并避免代码重复 这是一种好的做法吗?错了吗?它没用吗?当然,它只是想让事情更有表现力。表达性代码很好(TM) 不过,最重要的是,我要指出,co
使用
声明生成类型的不可变版本是错误的、正确的还是良好的做法
struct MutableA
{
int i;
float f;
};
using ImmutableA = const MutableA;
对于指针或ref成员,像这样的包装器可以确保不可变对象中的常量安全
这样做的好处是,将可变类型转换为不可变类型(我认为)不会产生任何成本,并避免代码重复
这是一种好的做法吗?错了吗?它没用吗?当然,它只是想让事情更有表现力。表达性代码很好(TM) 不过,最重要的是,我要指出,
const
并不意味着不可变
以下是一个示例:
using ImmutableString = std::string const;
std::string s = "Hello world";
ImmutableString& helloWorld = s;
s = "Bye!";
std::cout << helloWorld; // prints Bye!
最后,关于:
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?
这里可能有更多的背景信息:这就是const
的作用,对吗?你只是在做一个别名,我想这很好吧?虽然const MutableA
更容易阅读/理解imo.imo,但它使代码更难阅读。此外,我建议你关注是否会有这样的漏洞引入,而不是询问它的优点,这是基于意见的。<代码> const <代码>是C++程序员如何指定不可变性。您可以提供语法糖而不是惯用代码。@Michel有几种可能性,例如:(1)生产者是一个朋友类,(2)生产者创建一些中间的、内部的、可变的类,并在生成最终结果之前将内容复制到目标类(通过适当的构造函数)。这在很大程度上取决于您正试图做什么。@Michel您不一定有运行时命中率,编译器可以(并且在许多情况下会)对此进行优化(特别是如果中间类是生产者专用的)。你必须测试一下。请记住,不变性只适用于开发人员,cpu不关心。此外,更多的代码并不一定意味着“更难维护”。但是,方法在很大程度上取决于您的实际情况。谢谢!它清楚地表明,这不是一个有效的方法!
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?