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

时间:2018-08-07 06:56:46

标签: c++ g++ c++17

std::unary_function功能在c ++ 11中已弃用,在c ++ 17中已删除。但是使用c ++ 17编译器标志,该代码仍可以编译:

note

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

功能删除是编译器可选的吗?

3 个答案:

答案 0 :(得分:4)

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

换句话说,程序行为是 undefined

程序正常工作就是这种不确定行为的体现。也许您的实现定义了未定义的行为。但是,即使这样,您的代码也不是可移植的C ++ 17。

答案 1 :(得分:2)

拥有标准以及这些标准的多个版本固然很好,但现实是不同的工具链具有不同的合规性水平。

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

这只是后者的一种情况。

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

答案 2 :(得分:1)

我正在尝试查找适当的措词,但是在向std添加额外名称方面,实现的确有很多余地。这是您不能这么做的主要原因-这两个名称可能会冲突。

尤其是,现有的实现可以在std中具有帮助器类。因此std::unary_function可能仅成为此特定实现的帮助模板。