Boost logo

Boost Users :

Subject: [Boost-users] [intrusive_ptr] Strange ternary op behavior with MSVC14
From: TONGARI J (tongari95_at_[hidden])
Date: 2015-08-11 04:27:39


I found a strange bug while debugging:
This is the minimal example that shows the problem:
(the nullptr will be some other meaningful thing in real case)

#include <iostream>
#include <boost/smart_ptr/intrusive_ptr.hpp>
#include <boost/smart_ptr/intrusive_ref_counter.hpp>

template<class T>
struct wrapper
    wrapper() = default;

    wrapper(boost::intrusive_ptr<T> const& p) : _p(p) {}

    boost::intrusive_ptr<T> const& get_ptr() const
#if 0
        // This is OK.
        if (_p)
            return _p;
        return nullptr;
        // Strange behavior.
        return _p ? _p : nullptr;


    boost::intrusive_ptr<T> _p;

struct W : boost::intrusive_ref_counter<W>


template<class T1, class T2>
inline void test(wrapper<T1> const& s1, wrapper<T2> const& s2)
    auto tup = std::make_tuple(s1.get_ptr(), s2.get_ptr());
    std::cout << 0 << ":" << (void*)std::get<0>(tup).get() << "\n";
    std::cout << 1 << ":" << (void*)std::get<1>(tup).get() << "\n";

int main()
    wrapper<W> a(new W), b(new W);
    test(a, b);
    return 0;

If compiled with MSVC14, you'll see the 2 addresses are the same while they
If if-stmt is used instead, the problem won't be shown.
I also replaced intrusive_ptr with std::shared_ptr and the problem isn't
shown as well.
The same code works well with g++.

It seems intrusive_ptr & MSVC14 specific but I can't reason about...

Any idea?

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at