C++ 为什么“std::一元函数”仍然用c++;17?

C++ 为什么“std::一元函数”仍然用c++;17?,c++,g++,c++17,C++,G++,C++17,该功能在c++11中被弃用,在c++17中被删除。但有了c++17编译器标志,此代码仍然可以编译: struct less_than_7 : std::unary_function<int, bool> { bool operator()(int i) const { return i < 7; } }; struct less_than_7:std::一元函数 { 布尔运算符()(int i)常量{return i

该功能在c++11中被弃用,在c++17中被删除。但有了c++17编译器标志,此代码仍然可以编译:

struct less_than_7 : std::unary_function<int, bool>
{
    bool operator()(int i) const { return i < 7; }
};
struct less_than_7:std::一元函数
{
布尔运算符()(int i)常量{return i<7;}
};
内置
g++-std=c++17-O0-Wall-pedantic main.cpp


编译器是否可以实现功能删除?

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

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


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

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


特别是,现有的实现可以在
std
中包含帮助器类。因此,
std::一元函数
可能仅仅是这个特定实现的一个辅助模板

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

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

这只是后者的一个例子


VS2019已经删除了
std::一元函数
,但libstdc++和libc++都还没有删除。就是这样

尽管如此,这还是让编译器轻松了,不是吗?@kabanus:可能是的。所有C++标准库的作者都需要测试一下。不过,这是一个侵入性的添加。没有错误,没有警告,没有任何迹象表明这是不好的。。。对于编译器来说,这似乎不是一个好的行为。@FantasticMrFox与编译器无关,这是标准库实现的一个错误(大概是libstdc++的错误)将其报告为一个bug-它很容易修复,并且是UB代码的一个重要诊断。两个可能的答案:(1)libstdc++的维护人员还没有来得及删除它,或者(2)他们把它放在那里是为了让使用C++03/11/14编译的人向后兼容。