![]() |
1
5
正如安德烈指出的,在这种情况下,分配(大部分)没有什么意义。问题是
没有简单的治疗方法。甚至定义自己的赋值运算符并使用
C++ 11和更新的新增加了一些新的扭转这种情况。特别是,对象不再
需要
能够
通过添加一个间接级别来使用move而不是copy。如果您创建了一个“外部”和一个“内部”对象
…然后当我们创建
如果你想足够糟糕,你可以在老版本的C++中使用(排序)相同的技术。您仍然可以使用outer/inner类,但每个赋值都会分配一个全新的内部对象,或者您可以使用类似shared\u ptr的方法让外部实例共享对单个内部对象的访问,并在最后一个外部对象被销毁时将其清除。
这并没有什么实际的区别,但至少对于管理向量时使用的赋值,只有两个引用
|
![]() |
2
18
你自己说过你让const“在对象的生命周期内不会改变的任何东西”。但是您抱怨隐式声明的赋值运算符被禁用。但隐式声明赋值运算符 做 更改有问题的成员的内容!它被禁用是完全合乎逻辑的(根据你自己的逻辑)。或者你不应该声明成员const。
换句话说,对你遇到的问题提供一个更有意义的描述。到目前为止,你提供的一个是自相矛盾的最明显的方式。 |
![]() |
3
5
我很少使用它们-麻烦太大了。当然,当涉及到成员函数、参数或返回类型时,我总是力求const的正确性。 |
![]() |
4
4
编译时的错误是痛苦的,但运行时的错误是致命的。使用const的构造可能会给代码编写带来麻烦,但它可能会帮助您在实现bug之前找到bug。我尽可能使用常量。 |
![]() |
5
3
我尽我最大的努力遵循使用的建议
我发现我很小心
|
![]() |
6
3
我想知道你的案子。。。下面的一切都只是假设,因为您没有提供描述您的问题的示例代码,所以。。。 原因
IIRC,默认赋值运算符将逐个成员进行赋值,类似于:
因此,您的问题是,如果没有这个赋值运算符,STL容器将无法接受您的对象。
你的解决方案
我不敢理解你说的是什么意思
我自己的解决方案是编写以下用户定义运算符:
这样,如果您有:
在我看来,这是连贯的。但我想,读
也就是说下面的代码
但是,你在问题中写道:
我以为是你自己的
解决方案
|
![]() |
7
2
你可以储存
不过,正如其他人所指出的,如果希望使用编译器生成的复制构造函数,那么删除const限定成员会有点麻烦,而且在我看来通常更容易。 |
![]() |
8
1
使用const的最佳位置是函数参数、各种指针和引用、常量整数和临时方便值。 临时便利性变量的示例如下:
|
![]() |
9
1
然而
|
![]() |
10
0
我认为你的陈述
也用于STL。那么,您的观察结果可能依赖于编译器,或者只适用于成员变量? |
![]() |
11
0
如果类本身是不可复制的,我只会使用const成员。我有许多用boost::noncopyable声明的类
但是如果你想偷偷摸摸,让自己充满潜力 问题你可以在没有赋值的情况下实现一个复制构造,但是你必须这样做 小心一点。
输出
|
![]() |
12
0
这并不难。你不应该有任何困难,使你自己的赋值运算符。常量位不需要分配(因为它们是常量)。
更新
如果一个赋值应该改变它,那么它就不是常量。
如果您只是想阻止其他人更改它,请将其设置为私有,而不提供更新方法。
|
![]() |
13
0
从哲学上讲,这看起来是安全性能的权衡。用于安全的常数。据我所知,容器使用赋值来重用内存,即为了性能。他们可能会使用显式销毁和放置新的代替(逻辑上它是更正确的),但分配有机会更有效。我想,逻辑上是多余的要求“可分配”(拷贝可构造就足够了),但是stl容器希望更快更简单。 当然,可以将赋值实现为显式销毁+新放置,以避免const\u cast hack |
![]() |
14
-1
你基本上不想把一个常量成员变量放到一个类中(使用引用作为类的成员也是如此。)
|
![]() |
AstralHex · 矩阵乘法代码工作不正常 6 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 6 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 6 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 7 月前 |