I'd like to work out conventions on passing parameters to functions/methods. I know it's a common issue and it has been answered many times, but I searched a lot and found nothing that fully satisfies me.

Passing by value is obvious and I won't mention this. What I came up with is:

1. Passing by **non-const reference** means, that object is **MODIFIED**
2. Passing by **const reference** means, that object is **USED**
3. Passing by **pointer** means, that a reference to object is going to be **STORED**. Whether ownership is passed or not will depend on the context.

It seems to be consistent, but when I want to pick heap-allocated object and pass it to 2. case parameter, it'd look like this:

```
void use(const Object &object) { ... }

//...

Object *obj = getOrCreateObject();
use(*obj);

```

or

```
Object &obj = *getOrCreateObject();
use(obj);

```

Both look weird to me. What would you advise?

PS I know that one should avoid raw pointers and use smart instead (easier memory managment and expressiveness in ownership) and it can be the next step in refactoring the project I work on.