Using a function with reference as a function with pointers?

Posted by epatel on Stack Overflow See other posts from Stack Overflow or by epatel
Published on 2010-04-08T11:10:11Z Indexed on 2010/04/08 11:13 UTC
Read the original article Hit count: 293

Today I stumbled over a piece of code that looked horrifying to me. The pieces was chattered in different files, I have tried write the gist of it in a simple test case below. The code base is routinely scanned with FlexeLint on a daily basis, but this construct has been laying in the code since 2004.

The thing is that a function implemented with a parameter passing using references is called as a function with a parameter passing using pointers...due to a function cast. The construct has worked since 2004 on Irix and now when porting it actually do work on Linux/gcc too.

My question now. Is this a construct one can trust? I can understand if compiler constructors implement the reference passing as it was a pointer, but is it reliable? Are there hidden risks?

Should I change the fref(..) to use pointers and risk braking anything in the process?

What to you think?

#include <iostream>

using namespace std;

// ----------------------------------------
// This will be passed as a reference in fref(..)

struct string_struct {
    char str[256];
};

// ----------------------------------------
// Using pointer here!

void fptr(const char *str) 
{
    cout << "fptr: " << str << endl;
}

// ----------------------------------------
// Using reference here!

void fref(string_struct &str) 
{
    cout << "fref: " << str.str << endl;
}

// ----------------------------------------
// Cast to f(const char*) and call with pointer

void ftest(void (*fin)()) 
{
    void (*fcall)(const char*) = (void(*)(const char*))fin;
    fcall("Hello!");
}

// ----------------------------------------
// Let's go for a test

int main() {
    ftest((void (*)())fptr); // test with fptr that's using pointer 
    ftest((void (*)())fref); // test with fref that's using reference
    return 0;
}

© Stack Overflow or respective owner

Related posts about c++

Related posts about pass-by-reference