const XX放弃限定符[- fpermissive]
const XX discards qualifiers [- fpermissive]
在下面的代码段1中,mKnownSRList定义如下:
std::vector<EndPointAddr*> mKnownSRList;
我得到一个编译错误显示在代码片段2。你能告诉我这个代码有什么问题吗?getTipcAddress()和compareTo函数的内容如下面的代码片段3和4所示。
代码段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());
}
代码段2(编译错误)
ServiceRegistrarAPI.cpp:355:72: error: passing ‘const EndPointAddr’ as ‘this’ argument of ‘EndPointTipcAddr& EndPointAddr::getTipcAddress()’ discards qualifiers [- fpermissive]
代码段3 (getTipcAddress函数)
EndPointTipcAddr & getTipcAddress() { return mTipcAddress; }
CODE NIPPET 4 (compareTo function)
bool
EndPointTipcAddr::compareTo(EndPointTipcAddr &rhs)
{
if( (mType == rhs.getType()) && (mInstanceNo == rhs.getInstanceNo()) )
{
return true;
}
return false;
}
参见S5.1.2.5:
lambda表达式的闭包类型有一个公共内联函数描述了参数和返回类型的调用操作符(13.5.4)通过lambda表达式的参数声明子句和分别为尾随返回型。这个函数调用操作符是声明const(9.3.1)当且仅当lambdaexpression为参数声明子句后面没有mutable。两者都不是虚的,未声明的易失性。默认参数(8.3.6)不应该是在lambdaddeclarator的参数声明子句中指定。在lambda表达式上指定的任何异常规范都适用对应的函数调用运算符。一个lambda声明器中的Attribute-specifier-seq属于类型对应的函数调用操作符。[注:引用的名称在lambda声明器的上下文中查找lambda表达式。-end note]
基本上,这意味着生成的函子的操作符()默认为const
,并且您已按值捕获,并且捕获的变量是生成的函子的成员。
那么,你有两个选择:
- 按引用捕获,而不是按值捕获
-
将lambda更改为以下内容(注意参数声明子句后面的
mutable
):[srEndPointAddr](EndPointAddr* o) mutable { ... }
不允许谓词函数(std::remove_if
的第三个参数)修改对象。在迭代器上调用的所有方法必须为const
。请看这个文档:
函数不能修改其实参。
如果返回值的副本或const
指针,可以将getTipcAddress
设置为const
简而言之,你得到这个错误是因为你在const实例上调用了一个非const方法:srEndPointAddr
是const,但你在它上面调用了非const方法getTipcAddress
。您的解决方案是将此方法声明为const,因为它看起来是一个简单的getter,并且可能不会修改对象。
- C++ 将打印格式从整数 2255 更改为 $xx.xx
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 为什么这个.c文件只有一行"../xx/xx.c"?
- 无法在打开的 cv 3.xx 中画线
- 在静态成员函数中无效使用成员“xx::x”
- 错误:将“const sdf”作为“this”参数传递会丢弃限定符 [-fpermissive]
- 平息海湾合作委员会的"only available with -std=c++XX or -std=gnu++XX"警告
- ITK:在执行 HelloWorld 示例时找不到 ITKCommon-x.xx.dll
- 从"char"到"const char*"的无效转换[-fpermissive](idk why)
- 二进制树插入()const fpermissive误差
- 错误:从“ int*”转换为“ int” [-fpermissive]
- 将Boost iNCETE_INTERVAL传递给该参数丢弃了预选赛[-fpermissive]
- 递归调用中出现错误"[Error] expression list treated as compound expression in initializer [-fpermissive]"
- 错误:表达式列表在初始化器[-fpermissive] Double Paycalc(p,yir,y)中被视为复合表达式
- Windows C++ UWP:等待 XX 毫秒,直到事件发生
- 进行临时[-fpermissive]的地址
- 从"char"到"const char*"的转换无效 [-fpermissive] str::atoi (字符串到整数)
- 将矩阵传递给函数。 "invalid conversion from 'int (*)[columns]' to 'int' [-fpermissive]"
- 无法在 Mac OS X 上分配内存错误 - java(xx,xx) malloc: *** mmap(size=XX)
- const XX放弃限定符[- fpermissive]