Hi,
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)
```c++
#include <iostream>
#include
#include
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;
#else
// Strange behavior.
return _p ? _p : nullptr;
#endif
}
private:
boost::intrusive_ptr<T> _p;
};
struct W : boost::intrusive_ref_counter<W>
{
};
template
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
shouldn't.
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?