FIX: Modifying Const Temporary Object Doesn't Generate Error
ID: Q149324
 
  | 
The information in this article applies to:
- 
The C/C++ Compiler (CL.EXE), used with:
- 
Microsoft Visual C++, 32-bit Editions, versions  4.0, 4.1, 4.2, 5.0
 
 
SYMPTOMS
The compiler generates the following error when you invoke a non-const
member function on a const object:
error C2662: 'Set' : cannot convert 'this' pointer from 'const struct
A *' to 'struct A *const '
However, it does not generate this error when you invoke a non-const member function on a const object that is returned by a function.
RESOLUTION
To work around this problem, make the function return a reference to const.
STATUS
This bug was corrected in Microsoft Visual C++, version 6.0.
MORE INFORMATION
Sample Code
/* Compile options needed: None
*/ 
truct A {
 int m_i;
 A() { m_i = 0; };
 void Set() {m_i = 5;}
};
truct B {
 A m_a;
 // Change the return type to 'const A &' to work around
 const A GetMember() const {return m_a;}
};
void TestFunc(const B & b)
{
 const A a;
 // Next line correctly generates:
 // error C2662: 'Set' : cannot convert 'this' pointer from
 // 'const struct A *' to 'struct A *const '
 // a.Set(); // Uncomment this line to get the error
 // Next line does not generate the error even though
 // B::GetMember returns const A object.
 // Change the return type of B::GetMember to 'const A &'
 // to get the error.
 b.GetMember().Set();
}
void main()
{
 B b;
 TestFunc(b);
} 
Additional query words: 
Keywords          : kbVC400bug kbVC410bug kbVC420bug kbVC500bug kbVC600fix 
Version           : 
Platform          : 
Issue type        : kbbug