微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将指针传递给具有参考参数的函数

如何解决将指针传递给具有参考参数的函数

通常,这是由编译器捕获的。但是使用强制转换为函数指针,我们可以做到这一点。

我的措词可能不正确,这是一个示例,可以更好地说明我的问题:

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,它声称printintprintintp(&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_castreinterpret_cast等)。至少到那时,您不会放弃那么多的类型安全性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。