在尝试在 VS2008 项目中使用来自 std::select1st<functional> 时,我发现它被 _HAS_TRADITIONAL_STL 守卫 ifdef 了。

  • 这有什么原因吗?
  • 在包含 _HAS_TRADITIONAL_STL 之前简单地定义 <functional> 是否安全?
  • 最佳答案

    std::select1st 默认不存在的原因是它不是 C++ 标准库的一部分。它是标准模板库 (STL) 中未被 C++ 标准采用的部分之一。

    我在 MSDN 上找不到 _HAS_TRADITIONAL_STL 的任何文档,并且它似乎没有用于 Visual Studio 2010 分发的标准库版本。 Dinkumware 在将其交付给 Microsoft 时可能将其包含在库中。

    话虽如此,定义是否要使用 std::select1st 可能是安全的。请注意,使用该标志启用的任何内容都是特定于实现的且不可移植(甚至可能在 Visual C++ 版本之间发生变化)。您最好实现自己的 select1st 函数:

    template <typename PairT>
    struct select1st : public std::unary_function<PairT, typename PairT::first_type>
    {
        typename PairT::first_type operator()(const PairT& a) { return a.first; }
    };
    

    关于c++ - 定义 _HAS_TRADITIONAL_STL 以启用 STL 功能是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2504562/

    10-10 22:16