【发布时间】: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 进行一般检查似乎不是一个好主意(1、2),而且我没有看到合适的 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)。谢谢。 :)