LiK*_*Kao 5 c++ stl stl-algorithm
我目前正在查看一些代码,这些代码可以在较新版本的GCC上编译,但不能在较旧版本的GCC上编译.在我来说,我使用的是std::back_inserter到std::copy从一个数据结构中的一些数据,自定义数据结构.typedef value_type & const_reference但是,如果我忘记了此自定义数据结构中的typedef,则无法在GCC 4.4上编译.相同的代码在GCC 4.5上编译并运行正常.
这两个编译器版本之间有什么区别,这使得代码在一个版本上编译而在另一个版本上编译.我猜它与C++ 11的实现有关,这在GCC 4.4中完全不那么完整.decltype我想可能是某个或者另一个新的C++ 11关键字.
这个代码也正确,如果我使用std::back_inserter没有定义const_reference类型?我通常认为,一个必须实现全套的typedef(的value_type,reference,const_reference等),以便为与STL-算法库兼容?或者我可以安全地假设,如果我的代码在这种情况下编译,我不会调用任何危险的东西(例如移动语义,这会破坏我的其他数据结构).
标准(1998)说std::back_insert_iterator需要Container::const_reference.在"24.4.2.1 Template class back_insert_iterator",[lib.back.insert.iterator]中,它说:
back_insert_iterator<Container>&
operator=(typename Container::const_reference value);
Run Code Online (Sandbox Code Playgroud)
2011标准只想要Container::value_type,
back_insert_iterator<Container>&
operator=(const typename Container::value_type& value);
back_insert_iterator<Container>&
operator=(typename Container::value_type&& value);
Run Code Online (Sandbox Code Playgroud)
因此,要兼容两个版本的C++标准,请同时定义value_type和const_reference_type.
在GCC 4.4.6和4.5.1中,定义operator=是相同的(libstdc++-v3/include/bits/stl_iterator.h):
back_insert_iterator&
operator=(typename _Container::const_reference __value)
{
container->push_back(__value);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
我和两个编译器都有同样的错误,也许你需要仔细检查你是否使用了正确的编译器版本.