不同平台上比较方法中的 C++ 常量引用

标签 c++ linux windows gcc

我有一段用于对结构进行排序的 C++ 代码,

const bool operator<(P& p) const {
  //...
}

它在带有“gcc 4.9.2”的 linux 设备上编译没有任何问题。 但是,如果在装有“gcc 4.7.1”(Code::Blocks 13.12 附带的那个)的 Windows 机器上尝试它,它会给出令人讨厌的错误,您可以在此处看到http://pastebin.com/S28tD9kc

为了在这两种情况下进行编译,我都使用了:“g++ -std=c++11”

如果我将“operator<(P& p)”更改为“operator<(const P& p)”,它会神奇地起作用。好的,没问题,我犯了一些错误,但是如果第一个在 linux 机器上可以正常工作而没有任何问题迹象,为什么第一个在 windows 机器上不能工作?

example .

最佳答案

这可能是因为在那些 gcc 版本中排序的实现方式不同。我已经在 VS2005 下进行了检查,它也会产生此类错误,但是通过查看我的 STL 实现 - 我看到排序时使用了很多 const T& 参数。如果 operator< 不带 const& 参数使用,这将导致您看到的相同错误。我能够使用自定义比较器和 const_cast 编译此类代码:

struct my_comp {
 bool operator() (const P& a, const P& b) const {
   return const_cast<P&>(a).operator<(const_cast<P&>(b));
 }
};
std::vector<P> pp(10);
std::sort(pp.begin(), pp.end(), my_comp());

我不确定这是不是正确的代码,只是为了编译实验而写的。

另一方面,在 Visual Studio 2015 下,使用 operator< 中的非 const 参数都可以正常编译。在 VS2015 中,排序使用移动语义,我想这就是它编译的原因。

关于不同平台上比较方法中的 C++ 常量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34298050/

相关文章:

c++ - 浮点表示在 C++ 中是否依赖于编译器?

c++ - 保护类内存数组检测段错误

Linux Bash - 从 XML 文件中提取内容

java - 我不知道如何通过windows命令提示符输入

c++ - 为什么调用析构函数?

c++ - 有没有办法通过函数指针调用运算符函数?

c++ boost::iterator_range<iter> string_view 错误

未定义 Python 多处理池函数

windows - 在命令提示符下运行程序的双命令

java - OS X 上 Windows 环境下的测试程序