示例代码:
#include <string>
#include <set>
using namespace std;
class x
{
private:
int i;
public:
int get_i() const { return i; }
};
struct x_cmp
{
bool operator()(x const & m1, x const & m2)
#if _MSC_VER
const
#endif
{
return m1.get_i() > m2.get_i();
}
};
std::set<x, x_cmp> members;
void add_member(x const & member)
{
members.insert(member);
}
调用:
$ g++ -c -std=c++14 -pedantic -Wall -Wextra
<nothing>
$ clang++ -c -std=c++14 -pedantic -Wall -Wextra
<nothing>
$ icc -c -std=c++14 -pedantic -Wall -Wextra
<nothing>
$ cl /c /std:c++14 /Za
<nothing>
问题:为什么msvc需要const
,而其他人不需要?或者为什么其他人不需要const
?
这是LWG2542。在C++14中,比较运算符的措辞是";可能为const";,GCC和Clang将其解释为不要求比较运算符具有CCD_ 3资格。MSVC总是需要它。
这是一个措辞缺陷,因为关联容器的比较运算符应该是const
限定的。这在C++17中进行了更改,要求比较器为const
。这是一个破坏性的更改,因此有效的(尽管已破坏的(C++14代码可能无法在C++17中编译。