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.
功能删除是编译器可选的吗?
答案 0 :(得分:4)
由于它不再是C ++ 17标准的一部分,因此它包含在您的一个源代码文件中的类别与将事物引入std
的代码属于同一类别。
换句话说,程序行为是 undefined 。
程序正常工作就是这种不确定行为的体现。也许您的实现定义了未定义的行为。但是,即使这样,您的代码也不是可移植的C ++ 17。
答案 1 :(得分:2)
拥有标准以及这些标准的多个版本固然很好,但现实是不同的工具链具有不同的合规性水平。
这可能涉及延迟实现新功能,延迟实现更改或延迟删除内容。
这只是后者的一种情况。
VS 2019已删除std::unary_function
,但是libstdc ++和libc ++都还没有。就是这样!
答案 2 :(得分:1)
我正在尝试查找适当的措词,但是在向std
添加额外名称方面,实现的确有很多余地。这是您不能这么做的主要原因-这两个名称可能会冲突。
尤其是,现有的实现可以在std
中具有帮助器类。因此std::unary_function
可能仅成为此特定实现的帮助模板。