How to determine programmatically if an expression is rvalue or lvalue in C++?
What's the best way to determine if an expression is a rvalue or lvalue in C++? Probably, this is not useful in practice but since I am learning rvalues and lvalues I thought it would be nice to have a function is_lvalue
which returns true if the expression passed in input is a lvalue and false otherwise.
Example:
std::string a("Hello");
is_lvalue(std::string()); // false
is_lvalue(a); // true
Most of the work is already done for you by the stdlib, you just need a function wrapper:
template <typename T>
constexpr bool is_lvalue(T&&) {
return std::is_lvalue_reference<T>{};
}
in the case you pass a std::string
lvalue then T
will deduce to std::string&
or const std::string&
, for rvalues it will deduce to std::string
Note that Yakk's answer will return a different type, which allows for more flexibility and you should read that answer and probably use it instead.
I solved the above question using two overloaded template functions. The first takes as input a reference to a lvalue and return true
. Whereas the second function uses a reference to rvalue. Then I let the compiler match the correct function depending on the expression passed as input.
Code:
#include <iostream>
template <typename T>
constexpr bool is_lvalue(T&) {
return true;
}
template <typename T>
constexpr bool is_lvalue(T&&) {
return false;
}
int main()
{
std::string a = std::string("Hello");
std::cout << "Is lValue ? " << '\n';
std::cout << "std::string() : " << is_lvalue(std::string()) << '\n';
std::cout << "a : " << is_lvalue(a) << '\n';
std::cout << "a+b : " << is_lvalue(a+ std::string(" world!!! ")) << '\n';
}
Output:
Is Lvalue ?
std::string() : 0
a : 1
a+b : 0