2

我已经将我的开发机器更新到刚刚发布的 Ubuntu 12.04 版本,这显然给了我一个新版本的 GCC (4.6.3)。现在,用于编译的源代码给了我关于编译器生成的赋值运算符的错误:

source/local.cpp:1185:59: 错误:'olddata = stype::block_t((*(const oc::json_t*)(& local::database_t::getData(const sdata) 中的 'operator=' 不匹配::uuid_t&, size_t*, sdata::override::type_t)((* & uuid), (& otype), (sdata::override::type_t)1u))), 0)'
来源/local.cpp:1185:59:注意:候选人是:
source/sdata/block.hpp:13:7: 注意: sdata::block_t& sdata::block_t::operator=(sdata::block_t&)
source/sdata/block.hpp:13:7: 注意:参数 1 没有从 'sdata::block_t' 到 'sdata::block_t&' 的已知转换

据我所知,编译器生成的operator=应该有签名foo& operator=(const foo&),而不是foo& operator=(foo&). 这是这个版本的 GCC 中的一个错误,还是我的理解错误?我在 GCC bug-tracker 上找不到任何对此的引用,而且我不敢相信没有其他人遇到过它。

(谷歌并没有让搜索包含等号的术语变得容易,但耐心地我在这里找到了一个对这个问题的引用,讨论 GCC 4.6.2。)

4

2 回答 2

0

我曾经做过的一个字符串类的例子:

String& String::operator=(const String& other)  {       
    // checking for self-assignment (pointer-compare)       
    if(this != &other) {
        delete[] s_buffer;
        s_length = other.Length();
        s_buffer = new char[s_length+1];
        memcpy(s_buffer,other.c_str(),s_length+1);
    }
    return *this;   
}
于 2012-04-28T08:48:44.520 回答
0

我不知道什么是正确的,但 GCC 的行为肯定会导致问题。我称之为错误。

奇怪的是,似乎并不是每个班级都会发生这种情况,只有少数几个,所以在我想出一个简单的例子之前,我无法真正提交错误报告。

于 2012-05-02T01:37:15.613 回答