非const对象的Const向量

Hum*_*ger 24 c++ const vector const-correctness

在接口中定义函数时:

virtual void ModifyPreComputedCoeffs ( std::vector < IndexCoeffPair_t > & model_ ) = 0;
Run Code Online (Sandbox Code Playgroud)

我们想要指定不应该在push_back等意义上改变向量model_操作不应该对向量进行操作,但是可以更改model_中的IndexCoeffPair_t结构对象.我们该如何指定?

virtual void ModifyPreComputedCoeffs ( const std::vector < IndexCoeffPair_t > & model_ ) = 0;
Run Code Online (Sandbox Code Playgroud)

我觉得不行.

Mar*_*som 17

不是将向量传递给函数,而是执行标准库所做的事情,而是传递一对迭代器.

virtual void ModifyPreComputedCoeffs ( std::vector < IndexCoeffPair_t >::iterator & model_begin, std::vector < IndexCoeffPair_t >::iterator & model_end )
Run Code Online (Sandbox Code Playgroud)

  • 你在回避这个问题.如果他/她需要传递这样的向量的向量怎么办? (2认同)
  • @ 6502:大多数时候人们不想听到"那是不可能的",他们想知道如何实现这一目标. (2认同)

650*_*502 8

C++ const-correctness概念被IMO高估了.你刚才发现的是它有一个很大的局限性:它不能按构图进行扩展.为了能够创建非const对象的const向量,您需要实现自己的向量类型.请注意,例如,即使标准库也必须为const_iterators引入新类型.

我的建议是在你被迫的地方使用const-correctness,而不是在任何地方你都可以.理论上,const正确性应该有助于程序员,但由于语法的原因而且成本非常高而且非常原始(只有一点,不能按组合扩展,甚至需要代码重复).

同样根据我的经验,这个所谓的大帮助并不是那么大......它捕获的大多数错误都与const-correctness机器本身有关,而与程序逻辑无关.

有没有想过为什么大多数语言(包括在C++之后设计的语言)没有实现这个想法?

  • 无论意见如何,const正确性都存在于C++中,并且是一个重要的特性,如果避免,可能会导致严重的麻烦,并导致生产代码中的时间和金钱损失.虽然我喜欢这种情绪(并不一定不同意),但它更多的是对原始问题的评论而不是答案.6502 - 你对Mark Ransom的const_iterator答案提出了类似的论点. (9认同)
  • 这个答案是误导性的:访问const向量的非const元素的问题可以用迭代器解决(另一个答案),这证明它是std :: vector的问题,而不是语言的问题. (2认同)