Visual Studio 2010: Allowing Binding Non-Const Reference to Rvalue
Problem:
In the following code snippet, the Visual Studio 2010 (SP1) compiler compiles successfully without any errors or warnings, even though it appears to be an invalid initialization of a non-const reference to a temporary rvalue:
<code class="cpp">string foo() { return "hello"; } int main() { string& tem = foo(); // Should be illegal }</code>
Expected Behavior:
According to the C standard, binding a non-const reference to an rvalue should be considered an error or warning. This is because non-const references should only be bound to lvalues (objects with a permanent address).
VS2010 Behavior:
However, Visual Studio 2010 compilers have historically allowed this practice as an extension to the language. This behavior is not in accordance with the C standard and is generally considered a bug.
Reason:
The reason for this behavior is not entirely clear, but it is thought to be related to the fact that Visual Studio compilers have always been more lenient in terms of error checking and warnings. This laxity may have been introduced intentionally to allow for greater flexibility in writing code, although it does not follow the C standard.
Implications:
This behavior can have implications for code safety and performance. Binding a non-const reference to an rvalue can lead to unexpected results, as the rvalue may be modified or destroyed at any time.
Solution:
The recommended solution is to avoid binding non-const references to rvalues. Instead, use either a const reference (which can bind to both lvalues and rvalues) or a pointer.
The above is the detailed content of Why Does Visual Studio 2010 Allow Binding Non-Const References to Rvalues?. For more information, please follow other related articles on the PHP Chinese website!