INFO: Casting Difference Between C and C++ May Cause C2105 (88434)



The information in this article applies to:

  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 2.0
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0

This article was previously published under Q88434

SUMMARY

In C++, the result of a cast to a reference type is an lvalue; casts to any other type are not lvalues. This is explicitly stated in the "C++ Annotated Reference Manual," by Ellis and Stroustrup, on page 69. In a .C file, explicit casting to any data type may result in an lvalue only if Microsoft language extensions are enabled. The same error is generated in a .C file if Microsoft extensions are disabled.

This difference can cause problems in code that compiles without error using a C compiler. The sample code below illustrates this with a simple increment of a casted result. If it is compiled as a C source file, no errors are generated (although using warning level 4 generates "C4213: nonstandard extension used : cast on l-value"). However, if it is compiled as a C++ source file, the following error is generated:
error C2105: '++' needs lvalue
Microsoft C/C++ does provide a mechanism for achieving this by implementing a cast to a reference that achieves the same effect:
++(long*&)p;
				

Sample Code

/* Compile options needed:  none
*/ 

void main()
{
   char *p;

   ((long *)p)++;   // If the file is saved as a .CPP, this 
}                   // causes an error.
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbcode kbinfo kbLangC kbLangCPP KB88434