Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ const&;转换无效;参数到&;参数似乎是胡说八道?_C++_C++11_Reference_Constants_Function Pointers - Fatal编程技术网

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执行类似操作,不幸的是,无法推导签名。

您有一个“指向某个对象的指针”,希望传递一个“指向其他对象的指针”。在这种情况下,即使指向的类型相似,也没有隐式转换。