为什么 'std::unary_function' 仍然在 c++17 中编译?

Why does `std::unary_function` still compile in c++17?

本文关键字:c++17 编译 std unary 为什么 function      更新时间:2023-10-16

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建造。

功能删除对于编译器是否可选?

由于它不再是 C++17 标准的一部分,因此它包含在您的一个源代码文件中与将内容引入 std 的代码属于同一类别。

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

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

虽然有标准和这些标准的多个版本是件好事,但现实情况是,不同的工具链具有不同的合规性级别。

这可能涉及延迟实现新功能、延迟实施更改或延迟删除内容。

这只是后者的一个案例。

VS 2019 已经删除了std::unary_function,但 libstdc++ 和 libc++ 都没有。事情就是这样!

我试图找到合适的措辞,但实现在向std添加额外名称方面确实有很大的回旋余地。这是你不能的主要原因 - 这两个名字可能会发生冲突。

特别是,现有实现可以在std中具有帮助程序类。因此,std::unary_function可能只是此特定实现的帮助程序模板。