![]() |
1
38
我在您的代码中添加了几行。这足以说明为什么不允许这样做:
|
![]() |
2
22
你必须从类型系统的角度来考虑它。被实例化
|
![]() |
3
13
可能值得说明为什么执行所需的转换会违反常量正确性:
问题是
我认为C++在原则上可以通过允许转换来保持安全性。
同样,理论上它可以允许显式转换。实际上,它不允许显式转换,但只允许对象,而不允许引用;-)
因为模板系统不支持它,所以不能作为参考。如果允许转换,则会破坏的另一个示例:
现在,
|
![]() |
4
6
这样想: 你有两个这样的班级:
你希望这两个类能自动转换吗?
因此,vector<t*>和vector<t const*>是完全不同的类型。 我的第一个问题是你真的想存储指针吗? 如果是,我建议查看boost::ptr_容器。它保存指针,并在向量被破坏时将其删除。但更重要的是,它将包含的指针视为普通的std:vector处理其包含的对象。因此,通过使vector const,您只能将其成员作为const访问。
如果不需要存储指针,则将对象(而不是指针)存储在容器中。
|
![]() |
5
4
其他人已经给出了您给出的代码不能编译的原因,但我对如何处理它有一个不同的答案。我不认为有任何方法可以教编译器如何自动转换这两者(因为这将涉及更改
转换成一个完全不同的向量是不令人满意的(浪费内存和循环去做完全相同的事情)。我建议如下:
我在用
|
![]() |
6
3
正如其他人所说,转换不会应用于模板参数。换个说法,
…和:
…是完全不同的类型。 如果您试图对f()实现const正确性,而不是修改向量的内容,那么这可能更符合您要查找的内容:
|
![]() |
7
1
除了其他的答案,值得一读的是C++ FQA Lite,其中从关键POV中讨论了这个(以及许多其他C++特性): http://yosefk.com/c++fqa/const.html#fqa-18.1 |
![]() |
8
0
这就是模板的工作方式——没有对模板参数应用转换,所以这两个向量的类型完全不同。 |
![]() |
9
0
两者都是
以下汇编:
|
![]() |
10
0
这样的模板有点奇怪。从t到u的隐式转换并不意味着从xxx到xxx的隐式转换。它是可以实现的,但要实现它,需要在模板代码中做大量的额外工作,而且现在,我怀疑当
编辑:像这样的问题是使用迭代器的动机的一部分。即使是一个
如果更换:
用:
然后:
会很好的——也会:
|
|
wavesinaroom · 断言结构向量长度 6 月前 |
![]() |
Amarth Gûl · 找到一组向量的最近收敛点 6 月前 |
![]() |
P_B · 如何从矩阵中减去均值向量 11 月前 |
![]() |
TheEagle · 根据迭代器的顺序向前或向后迭代 11 月前 |
![]() |
Mary Ann Moody · 如何创建一个包含2个元素的向量? 1 年前 |
![]() |
Chris · 如何在OpenSCAD中的FOR循环中成对创建矢量元素 1 年前 |