代码之家  ›  专栏  ›  技术社区  ›  Fantastic Mr Fox

为什么std::一元函数仍然在c++17中编译?

  •  3
  • Fantastic Mr Fox  · 技术社区  · 8 年前

    这个 std::unary_function 功能在c++11中被弃用,在c++17中被删除。但使用c++17编译器标志时,此代码仍然可以编译:

    struct less_than_7 : std::unary_function<int, bool>
    {
        bool operator()(int i) const { return i < 7; }
    };
    

    用 g++ -std=c++17 -O0 -Wall -pedantic main.cpp here.

    对于编译器来说,功能删除是可选的吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Bathsheba    8 年前

    因为它不再是C++ 17标准的一部分,它包含在一个源代码文件中,与导入事物的代码属于同一个类别。 std .

    换句话说,程序行为是 未定义 .

    程序工作是这种未定义行为的一种表现。或许你的实现 定义 不明确的行为。但即便如此,您的代码不是可移植的C++ 17。

        2
  •  2
  •   Lightness Races in Orbit    7 年前

    虽然有标准和这些标准的多个版本是很好的,但事实是不同的工具链具有不同的遵从性级别。

    这可能包括延迟实现新功能、延迟实现更改或延迟删除内容。

    这只是后者的一个例子。

    VS 2019已取消 std::unary_function ,但libstdc++和libc++都还没有。就是这样!

        3
  •  1
  •   MSalters    8 年前

    我试图找到合适的措辞,但是实现在添加额外的名称到 std . 这是你不能的一个主要原因-两个名字可能会冲突。

    特别是,现有的实现中可以有帮助类。 性病 . 因此 std::unary_function 可能只是这个特定实现的一个辅助模板。