【发布时间】:2014-10-20 14:49:06
【问题描述】:
在Qt 5.2.1中,下面的代码结果怎么不一样?
QVector<int> c;
if (c.cbegin() != c.begin())
{
std::cout << "Argh!" << std::endl;
}
这会打印“argh”,但以下不会。
QVector<int> c;
if (c.begin() != c.cbegin())
{
std::cout << "Argh!" << std::endl;
}
请注意,cbegin 和 begin 位置是交换的。 但是,如果您更改容器状态,我的意思是例如 push_back 在其中的某些内容,它可以正常工作。 在我看来,在容器上调用任何可变方法之前,cbegin 和 cend 都是无效的。 是错误还是功能?
【问题讨论】:
-
嗯,总是有
std::vector。;) -
这怎么可能是一个功能?
-
我追踪到 begin 和 cbegin。 cbegin 方法只是返回指向内部缓冲区的指针,begin 方法首先调用 detach 方法(按需写入)。在这种情况下(默认构造)分离调用 reallocData 反过来改变内部缓冲区指针并开始返回这个新指针。我认为这是一个错误,应该报告。
-
@GreenScape 不,就标准库容器而言,comparison is well defined。我对 Qt 了解不多,但考虑到它们记录了 STL 风格的迭代器 是普通指针的 typedef,就语言而言,比较本身是很好定义的。结果应该也符合预期,但它失败的事实是一个不幸的实现细节。
-
@GreenScape 不,标准库容器保证“在表达式
i == j(等)中,i和j表示容器的iterator类型的对象,其中一个或两个可以被容器的const_iterator类型的对象替换,该对象引用相同的元素,语义没有变化”。