C++ const&;转换无效;参数到&;参数似乎是胡说八道?
我只是好奇。我将指针传递给带有签名的函数C++ const&;转换无效;参数到&;参数似乎是胡说八道?,c++,c++11,reference,constants,function-pointers,C++,C++11,Reference,Constants,Function Pointers,我只是好奇。我将指针传递给带有签名的函数 void printCommandReceived(const CommandDescriptor &descriptor) CommandLogFilter::CommandLogFilter(QSharedPointer<LogServer> logServer, QObject *parent, void (*preprocessValidCommand)(CommandDescri
void printCommandReceived(const CommandDescriptor &descriptor)
CommandLogFilter::CommandLogFilter(QSharedPointer<LogServer> logServer, QObject *parent,
void (*preprocessValidCommand)(CommandDescriptor &descriptor))
作为带签名的构造函数的第三个参数
void printCommandReceived(const CommandDescriptor &descriptor)
CommandLogFilter::CommandLogFilter(QSharedPointer<LogServer> logServer, QObject *parent,
void (*preprocessValidCommand)(CommandDescriptor &descriptor))
根据我的理解,对非常量对象的引用应该可用作引用常量对象参数的参数。因此,接受非常量对象引用的类型指针指向函数的参数应该比接受偶数常量对象引用的类型指针指向函数的参数更满意(并从中进行隐式转换)
我错在哪里?void(*)(const CommandDescriptor&)
和void(*)(CommandDescriptor&)
是两种完全不同的、不相关的类型
关于const
有非常简单的规则:X*
可以转换为X const*
,X**
可以转换为X const*const*
等等。参考资料也是一样。除此之外,不允许任何其他行为
请注意,规则不允许在类型中的任何位置任意添加或删除const
,例如,X**
不能转换为X const**
。函数参数的位置也是如此:您不能在那里添加或删除const
以获得兼容的类型
这些规则是否可以扩展以适应像您这样的情况并保持一致?可能是这样。但事实并非如此。C++有一组有限的情况,可以隐式添加或删除
const
。你遇到了一个无法做到的问题。不这样做的原因可能很简单,“描述那些安全的案例会很难,而标准编写者又懒惰又保守”
作为解决方法,您可以执行以下操作:
CommandLogFilter bob(
logServer,
parent,
[](CommandDescriptor &descriptor) {
return printCommandReceived(descriptor);
}
);
由于无状态lambda可以隐式转换为指向与其签名匹配的函数的指针
我不想让签名显式出现,但无法使用模板“auto”lambdas执行类似操作,不幸的是,无法推导签名。您有一个“指向某个对象的指针”,希望传递一个“指向其他对象的指针”。在这种情况下,即使指向的类型相似,也没有隐式转换。