如何解决将指针传递给具有参考参数的函数
通常,这是由编译器捕获的。但是使用强制转换为函数指针,我们可以做到这一点。
我的措词可能不正确,这是一个示例,可以更好地说明我的问题:
void printintp(int *ip)
{
printf("pointer = %p\n",ip);
printf("*pointer = %d\n",*ip);
}
void printint(int &i)
{
printf("int = %d\n",i);
}
int main()
{
int a = 555;
//int &irp = &a; // ERROR 1
void (*f)(void *);
//printint((int &) &a); // ERROR 2
f = (void (*)(void *))printintp;
f(&a);
f = (void (*)(void *))printint;
//printint(&a); // ERROR 3 (invalid conversion of `int *` to `int`)
f(&a); // GOOD (why?)
return 0;
}
输出当然是人们所期望的:
pointer = 0x7ffd01995bf4
*pointer = 555
int = 555
因此,我的问题可归结为:为什么将指针&a
传递给预期对象函数printint
可以?这种不确定的行为是否恰好适用于我的实现?如果不是,那么如果我们仅传递参数int &i
到对象a
的地址,它将如何绑定到对象ERROR 2
?为什么它拒绝我标记为printintp
的对象?
PS:在这个问题上,我能找到的最好的是this,它声称printint
和printintp(&a)
在功能上是相同的,尽管实际上,函数调用是不同的(printint(a)
和public class MyOptionsValidator : IValidateOptions<MyOptions>
{
private readonly ILoggerFactory _loggerFactory;
private ILogger _logger;
protected ILogger Logger
{
get
{
if(_logger == null)
{
_logger = _loggerFactory.CreateLogger(GetType());
}
return _logger;
}
}
public MyOptionsValidator(ILoggerFactory loggerFactory)
{
_loggerFactory = loggerFactory;
}
public ValidateOptionsResult Validate(string name,MyOptions myOptions)
{
if (string.IsNullOrEmpty(myOptions.DirectoryPath) || string.IsNullOrEmpty(myOptions.FileName))
{
Logger.LogWarning("Invalid");
return ValidateOptionsResult.Fail("Invalid");
}
return ValidateOptionsResult.Success;
}
}
)。
PS2:请注意,我并不是在问指针和引用之间的区别,here已经对此进行了非常详尽的解释。
解决方法
这种不确定的行为恰好在我的实现中起作用吗?
是的。大多数编译器使用幕后的指针实现引用,但这不是标准规定的。
标准语法不允许将指针原样分配给引用,反之亦然,因此这些语句的编译器错误。
将所有内容都放到void*
上,所有押注都不放在类型安全性上。使用C-style type cast,您几乎可以摆脱一切。您基本上是在告诉编译器您知道自己在做什么,因此它应该只接受它并且保持安静。这就是为什么当您不知道您真正在做什么时,这种类型转换会很危险的原因,除非绝对必要,否则应避免使用。如果必须强制转换,请改用C ++样式类型强制转换(static_cast
,reinterpret_cast
等)。至少到那时,您不会放弃那么多的类型安全性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。