2

我对 GCC 和 libstdc++ 的经验很少。尝试在 C++11 中编译一个非常简单的程序,我发现编译器错误看起来 STL 没有为双端队列实现新的 C++11 接口。

示例程序:

#include <deque>

int main() {
   std::deque<int> c;
   std::deque<int> d;

    c.insert(c.cbegin(), d.begin(), d.end()); // unable to match insert(const_iterator, iterator, iterator)
    auto it=c.insert(c.begin(), d.begin(), d.end()); // unable to match iterator = insert(iterator, iterator, iterator)
}

运行以下命令行,我在注释行中得到编译错误:

g++ -std=c++11 -o test test.cpp

(安装的 gcc/libstdc++ 版本为 4.8.1)

看起来 STL 没有实现:

template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last );

http://en.cppreference.com/w/cpp/container/deque/insert,或标准 C+11 23.3.3.4 deque 修饰符)

我知道 libstdc++ 还没有完全实现 C++11,但状态页面(http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2011)仅建议分配器和传播要求还没有完成。

所以我的问题:

  • 实际上 libstdc++ 中没有完整的 C++std::deque接口实现,还是我遗漏了什么?(也许我没有使用正确的库版本,或者我在命令行中缺少一些参数;我对 gcc/g++ 没有太多经验)。
  • 如果这是我的错误,我该如何解决?
4

1 回答 1

4

您的代码是有效的,并且被 GCC 4.9.0 的 libstdc++ 接受(并且也被 clang 的 libc++ 接受了一段时间)。您链接到的状态页面对此发出警告:

本页描述了主线 GCC SVN 中的 C++11 支持,而不是任何特定版本。

因此,某些内容被列为已实现的事实不应被视为暗示它已在您安装的 GCC 版本中实现。

于 2014-05-05T10:04:08.023 回答