【问题标题】:C++98 v. C++11 std::set::insert SpecificationsC++98 诉 C++11 std::set::insert 规范
【发布时间】:2014-08-11 19:31:44
【问题描述】:

作为位置提示传递给std::set::insert(iterator position, const value_type& val)std::multiset::insert(iterator position, const value_type& val) 的迭代器的含义在C++98 和C++ 11 之间发生了变化。在编译时是否有一种简单的方法来检测哪些正在使用并使用不同的代码?

对 C++11 进行一般检查似乎不是一个好主意(12),而且我没有看到合适的 Boost.Config 宏。

具体来说,C++98 的 documentation 表示:

如果 position 指向 将插入的元素之前的元素。

对于 C++11,它说:

如果 position 指向 将跟随插入的元素的元素(或者到最后,如果它 将是最后一个)。

这很重要,因为提示会影响插入调用的复杂性。如果提示正确,则复杂度只是一个摊销常数。但如果不是,它的大小是对数的。

更新

正如下面 JerryCoffin 很好地描述的那样,C++98 规范本质上是一个错字。

【问题讨论】:

  • IIRC 标准已更改为匹配(大部分)现有实现,因此您的测试可能不是一个好主意。至少你应该检查你正在使用的编译器。
  • 我刚刚在标准中验证了这一点;我不知道。唉,不,没有办法检查,但正如马克所说,你真的不需要。假设 C++11 行为,你应该没问题。
  • @Jerry:呸,真的刚刚发现了我自己(好吧,无论如何open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#233,还有n1780)。你可以接受答案。
  • 全部。很高兴知道(尽管现在我还有其他一些旧代码要修复:P)。谢谢。 :)

标签: c++ c++11


【解决方案1】:

这是defect reportLWG issue #233n1780 的主题。

如上所述,这显然是编辑 C++98 标准时的一个简单错误。

Stepanov 的原始实现根据当前规范工作,据我所知,大多数(所有?)实现都做了同样的事情(尽管有一个在提示之后看起来既在 之前又在位置,因此如果您指定其中一个,您将获得最佳行为)。

这也可以暗示插入将在集合的开头,这在以前的规范下是不可能的。

【讨论】:

  • 之前和之后查看了哪个实现?这对我来说很有趣
  • @MooingDuck:我不记得了。它在 DR 中提到过,当时我设法找到了它是哪一个,但从那以后的大约 15 年里,我恐怕已经忘记了它是哪一个。
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多