Understanding the Restrictions on References to Temporary Objects
In C , the prohibition of non-const references to temporary objects has sparked speculation about its rationale. While common explanations cite dangers associated with modifying temporary objects, a more nuanced examination is required.
Consider the following example:
String& a = String("test"); // Error
This assignment raises an error, preventing the creation of a non-const reference to a temporary object. Conversely, assigning the temporary object to a const reference is permitted:
const String& a = String("test"); // Ok
The rationale behind this restriction lies in the potential pitfalls of modifying function parameters. Suppose references to temporaries were allowed:
void inc(double& x) { x += 0.1; } int i = 0; inc(i);
In this scenario, modifying the function parameter x will not reflect in the actual value of i. This unexpected behavior can lead to subtle errors and is prevented by prohibiting non-const references to temporaries.
However, this explanation begs the question: why allow reading from temporary objects while restricting writing to them? If temporary objects are discarded after the statement, wouldn't restricting read access as well make sense to mitigate potential problems?
The answer lies in the technical limitations of a compiler. When passing a temporary object by value, a copy must be made before calling the function. For reference parameters, this copy process is unnecessary; instead, the reference is directly bound to the temporary object in memory. Allowing read access to temporary objects allows this technique to be leveraged for efficiency.
Therefore, while modifying temporary objects is prohibited due to potential errors in function parameters, allowing read access from references to such objects provides performance benefits without introducing significant risks.
The above is the detailed content of Why Can't I Create Non-Const References to Temporary Objects in C ?. For more information, please follow other related articles on the PHP Chinese website!