D
Daniel Lidström
Hello!
I have a strange problem with my pimpl implementation. What happens is that
const correctness is not respected. Let me go straight to the code:
#include <iostream>
struct Geometry {};
class LineData
{
class LineDataImpl;
LineDataImpl& mImpl;
public:
LineData();
const Geometry& GetGeometry() const;
/* */ Geometry& GetGeometry() /* */;
};
class LineData::LineDataImpl
{
Geometry mGeometry;
public:
const Geometry& GetGeometry() const
{
std::cout << "Calling const overload" << std::endl;
return mGeometry;
}
Geometry& GetGeometry()
{
std::cout << "Calling non-const overload" << std::endl;
return mGeometry;
}
};
LineData::LineData()
: mImpl(*(new LineDataImpl))
{ }
const Geometry& LineData::GetGeometry() const
{
return mImpl.GetGeometry();
}
Geometry& LineData::GetGeometry()
{
return mImpl.GetGeometry();
}
int main()
{
const LineData lineData;
const Geometry& geometry = lineData.GetGeometry();
return 0;
}
This sample shows that despite my intentions of being const correct, the
compiler ends up calling the non-const overload. What is going on here?
I'm using Visual Studio 2008, SP1.
Thanks in advance!
I have a strange problem with my pimpl implementation. What happens is that
const correctness is not respected. Let me go straight to the code:
#include <iostream>
struct Geometry {};
class LineData
{
class LineDataImpl;
LineDataImpl& mImpl;
public:
LineData();
const Geometry& GetGeometry() const;
/* */ Geometry& GetGeometry() /* */;
};
class LineData::LineDataImpl
{
Geometry mGeometry;
public:
const Geometry& GetGeometry() const
{
std::cout << "Calling const overload" << std::endl;
return mGeometry;
}
Geometry& GetGeometry()
{
std::cout << "Calling non-const overload" << std::endl;
return mGeometry;
}
};
LineData::LineData()
: mImpl(*(new LineDataImpl))
{ }
const Geometry& LineData::GetGeometry() const
{
return mImpl.GetGeometry();
}
Geometry& LineData::GetGeometry()
{
return mImpl.GetGeometry();
}
int main()
{
const LineData lineData;
const Geometry& geometry = lineData.GetGeometry();
return 0;
}
This sample shows that despite my intentions of being const correct, the
compiler ends up calling the non-const overload. What is going on here?
I'm using Visual Studio 2008, SP1.
Thanks in advance!