On 20.05.2015 09:47, Vladimir Ozerov wrote:
> I do not think we will sacrifice anything. C++11 has lots new features such
> as smart pointers and lamdas, but I do not see where we can use them on our
> public API.
I would definitely recommend using C++03 (or C++98; the only differences
are in the standard library). I would also very strongly recommend not
depending on Boost unless it's absolutely unavoidable: Boost is lovely
if you need it, but a huge albatross around the neck if you don't.
C++03 is C++98+TR1 and does have both std::shared_ptr and std::weak_ptr
whereas C++98 does not. Both have smart pointers (std:auto_ptr is a
smart pointer).
Note that C++98/03 is not completely source-compatible with C++11. You
have to be very aware of that. For example:
#define X " world"
"Hello"X;
is valid C++98 (and valid C as well), but not valid C++11 where the X is
interpreted as a custom string suffix. So in order to maintain forward
compatibility, you have to write
"Hello" X;
instead. This can be extremely painful to do in legacy code.
> For example, both Hazelcast and GigaSpaces has the following API for cache
> GET:
> boost::shared_ptr<MyVal> val = cache<MyKey, MyVal>.get();
Ahem. This is not valid C++.
> Boost contributed smart poitners to C++11
To C++03.
> and we can implement it as
> follows now:
> std::shared_ptr<MyVal> val = cache<MyKey, MyVal>.get();
>
> I.e., with pure C++11 and no dependency on Boost. But in my opinion
> returning smart pointer from cache GET doesn't add any value comparing to
> returning unmanaged pointer, which user can wrap into smart pointer later
> if he really needs it:
> MyVal* val = cache<MyKey, MyVal>.get();
And this is a memory leak. You can't just wrap a raw pointer in a shared
pointer and go happily coding, expecting that you've got your memory
problems solved. Let's say you do this:
std::shared_ptr<MyVal> smartval(val);
* When smartval goes out of scope, it deletes the value, making the
reference inside the cache invalid.
* When the value is ejected from the cache, smartval's pointer becomes
invalid.
Either return by value, or return a smart pointer: a constant shared_ptr
if you're returning references to objects in the cache, or either
auto_ptr or shared_ptr if you're returning copies allocated on the heap.
Anything else is an accident waiting to happen.
> I think having less dependencies and greater backward compatibility
> outweight features like this.
Having working code outweighs having more dependencies any day. And I'm
already extremely happy that I won't have to review, fix or use that C++
code. :)
-- Brane