Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;通过类型别名的不变性_C++_Immutability_Using Declaration - Fatal编程技术网

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?