const XX丢弃限定符[ - fpermissive]

时间:2013-03-25 15:16:18

标签: c++ c++11

在下面的代码片段1中,mKnownSRList定义如下:

std::vector<EndPointAddr*> mKnownSRList;

我收到代码片段中显示的编译错误2.您能告诉我这段代码有什么问题吗? getTipcAddress()和compareTo函数的内容显示在下面的代码片段3和4中。

CODE SNIPPET 1(已标记编译错误)

void 
ServiceRegistrarAPI::removeKnownSR(EndPointAddr & srEndPointAddr)
{
   auto last = 
   std::remove_if(mKnownSRList.begin(),
                  mKnownSRList.end(),
                 [srEndPointAddr]( EndPointAddr* o )
                 { 
                    //LINE 355 is the following
            EndPointTipcAddr myTipcAddress = srEndPointAddr.getTipcAddress();
                EndPointTipcAddr otherTipcAddress = o->getTipcAddress();

            return (myTipcAddress.compareTo(otherTipcAddress));
         });

    if(*last != nullptr)
    {
     delete *last;
    }

    mKnownSRList.erase(last, mKnownSRList.end());    
}

SNIPPET 2(编译错误)

  ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’   argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [-  fpermissive]

CODE SNIPPET 3(getTipcAddress函数)

EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }

CODE NIPPET 4(compareTo功能)

  bool

  EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) 
  {     
      if( (mType == rhs.getType()) && (mInstanceNo == rhs.getInstanceNo()) )
      {
        return true;
      } 

      return false;
  }

4 个答案:

答案 0 :(得分:5)

见S5.1.2.5:

  

lambda表达式的闭包类型具有公共内联函数   调用操作符(13.5.4),其中描述了参数和返回类型   由lambda-expression的parameter-declaration-clause和   尾随型分别。这个函数调用运算符是   声明const(9.3.1)当且仅当lambdaexpression的时候   参数声明子句后面没有可变的。它既不是   虚拟也未声明易变。默认参数(8.3.6)不得   在lambdadeclarator的parameter-declaration-clause中指定。   在lambda表达式上指定的任何异常规范都适用   到相应的函数调用操作符。一个   lambda声明符中的attribute-specifier-seq属于该类型   相应的函数调用操作符。 [注意:引用的名称   在lambda-declarator中查找上下文中的   lambda-expression出现。 - 后注]

基本上,暗示是默认情况下生成的仿函数的operator()为const,并且您已按值捕获,并且此捕获的变量是生成的仿函数的成员。

所以,你有两个选择:

  1. 通过引用捕获,而不是按值捕获。
  2. 将lambda更改为以下内容(请注意参数声明子句后面的mutable):

    [srEndPointAddr](EndPointAddr* o) mutable { ... }

答案 1 :(得分:3)

不允许谓词函数(std::remove_if的第三个参数)修改对象。在迭代器上调用的所有方法都必须是const。见this documentation

  

该函数不得修改其参数。

如果要返回值的副本或getTipcAddress指针,则可以将const设置为const

答案 2 :(得分:0)

简而言之,您会收到此错误,因为在这种情况下您在const实例上调用非const方法:srEndPointAddr是const但您在其上调用非const方法getTipcAddress。你的解决方案是声明这个方法const,因为它似乎是一个简单的getter,可能不会修改对象。

答案 3 :(得分:0)

这是如何解决问题的答案,而不是为什么会出错(感谢juanchopanza)

我猜你对const限定符有一些问题。

const添加getTipcAddress - 限定重载:

EndPointTipcAddr & getTipcAddress() const { return mTipcAddress; }
                                    ~~~~~

并在const末尾添加compareTo

bool EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs) const
                                                        ~~~~~