| Jon Stewart on 17 May 2003 00:27:01 -0000 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: [ALACPP] Chris' stupid C++ trick of the week |
> So, this is a little off the core purpose of this list, but I thought
> I'd share a C++ tidbit.
I'd say this is quite on-topic.
> template<typename T>
> T& doFoo(T& aTarget) {
> //do something with aTarget
> return aTarget;
> }
...
> The object referenced by aBar may be destroyed when you exit the doFoo()
> block (and obviously before the caller gets a chance to look at it).
> How? Well, the compiler actually has the option of passing arguments to
> doFoo() by value. Of course this is only in the special case of a
> parameter passed as a ref to a const.
I didn't know compilers were allowed to do that. It seems patently broken.
Someone needs to rant at Bjarne about that.
> 1) Use compile time assertions to ensure that the template is not
> instantiated on const types.
>
> 2) Make sure Bar's copy constructor is private, and better still with
> pure virtual functions which will cause a linker error in the event that
> you get by the privacy restriction.
>
> 3) Use a typelist to limit the types which my generic function can take
> to a select set of non-const types.
>
> 4) Use a compiler that always inlines templated function calls. ;-)
Well, I'd prefer specifying the function as inline. It's not guaranteed to
work -- compilers always have the option of not-inlining -- but... I'd bet
most of them would take you at your word, especially for a template
function.
Otherwise you could be lame and change the function signature to be:
doFoo(T *foo)
Pointers are cheesy, but they work (unlike references).
Jon
--
Jon Stewart
stew1@xxxxxxxxxxx
_______________________________________________
alacpp mailing list
alacpp@xxxxxxxxxxx
http://lists.ellipsis.cx/mailman/listinfo/alacpp