I have always thought that the following function, which accepts a universal reference, must return a const-reference.
template <typename T>
const T& Const(T&& val)
{
return val;
}
However, the following code compiles successfully with VS C++ and gcc:
int x = 5;
Const(x) = 6;
The value of the variable x is equal to 6 after the run. Thus, the Const function returns a non-const reference.
To obtain a compiler error, the function Const must be modified either to accept a conventional l-value reference or to be declared as returning const std::remove_reference_t<T>&
.
Why is that? What rule did I miss? Thanks in advance!
an universal reference
No, they're called "forwarding references". The term "universal reference" is deprecated.
Why is that?
When you invoke Const(x)
, x
is an lvalue, therefore T
is deduced as int&
. Your return type then becomes:
const T & = T const &
-> int & const &
-> int &
int & const &
is a reference to a const
reference to an int
which is the same as int&
. (In this case the const
applies to int&
, not just int
, as T = int&
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With