Re: How to detect const reference to temporary issues at compile or runtime?
On 12/2/2010 02:54, Dragan Milenkovic wrote:
On 12/01/2010 01:26 PM, Daniel Kr?gler wrote:
On 12/1/2010 04:07, Clinton Mead wrote:
Hi All
I've found recently that most of the errors in my C++ programs are of
a form like the following example:
#include<iostream>
class Z
{
public:
Z(int n) : n(n) {}
int n;
};
class Y
{
public:
Y(const Z& z) : z(z) {}
const Z& z;
};
In C++0x you could add the following deleted constructor
Y(const Z&&) = delete;
to prevent rvalues to bind to the first constructor.
I like that! Although, I would opted for Y(const Z * z)
or maybe a smart pointer parameter and would document
that the instance of Z must outlive the instance of Y.
And about such code being in a 3rd party library, how about
making a wrapper?
Y make_Y(const Z * z) { return Y(*z); }
... or use Daniel's suggestion on make_Y.
In fact the new C++0x library follows a similar approach in regard to
the class template reference_wrapper (which is quite similar to class Y
above):
template <class T> reference_wrapper<T> ref(T&);
template <class T> reference_wrapper<const T> cref(const T&);
template <class T> void ref(const T&&) = delete;
template <class T> void cref(const T&&) = delete;
template <class T> reference_wrapper<T> ref(reference_wrapper<T>);
template <class T> reference_wrapper<const T> cref(reference_wrapper<T>);
and the class template synopsis:
template <class T> class reference_wrapper
[..]
{
public :
[..]
// construct/copy/destroy
reference_wrapper(T&);
reference_wrapper(T&&) = delete; // do not bind to temporary objects
reference_wrapper(const reference_wrapper<T>& x);
[..]
};
HTH & Greetings from Bremen,
- Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]