Error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
Solution 1
A non-const
reference parameter, such as an int&
, can only refer to an "lvalue," which is a named variable.
auto takes_nonconst_reference = [](int&){};
auto takes_const_reference = [](const int&){};
auto takes_value = [](int){};
auto returns_int = []{return 42;};
int foo = 1;
// OK
takes_nonconst_reference(foo);
takes_const_reference(foo);
takes_const_reference(returns_int());
takes_value(foo);
takes_value(returns_int());
// compilation error, value returned from a function is not a named variable
takes_nonconst_reference(returns_int());
In this particular case, since your class is storing a copy of the constructor parameter, you should pass it by value (int
, not int&
nor const int&
).
Solution 2
Don't pass int&
, it can't be bound to a constant or temporary because those can't be modified - use const int&
instead.
Actually for simple types you should prefer to pass by value instead, and let the optimizer worry about providing the best implementation.
Related videos on Youtube

sheucm
I am a data engineer and web application developer in Taiwan Micron. I have been doing frontend in Angular/HTML/CSS/JavaScript for over 5 years and backend web development in NodeJS. In addition to web skills, I also write Python, Java, Android, and C++, which depends on work needs. Now, I'm focusing on data engineering skills such as Google Cloud Platform, Apache Airflow, Apache NiFi, etc.
Updated on July 09, 2022Comments
-
sheucm 11 months
I need to create a
Bar
object, which has a private objectFoo f
.However, the value of
Foo
object parameter should be passed by the specific methodint genValue()
.If I initialize
f
in the constructor scopeBar(){...}
, the compiler yell error, something like there is no constructorFoo()
.If I construct like this
Bar(): f(genValue())
, the compiler yells the error:test.cpp: In constructor ‘Bar::Bar()’: test.cpp:16:19: error: cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’ Bar(): f(genValue()){ ~~~~~~~~^~ test.cpp:7:2: note: initializing argument 1 of ‘Foo::Foo(int&)’ Foo(int &x) { ^~~
Example code:
class Foo { public: Foo(int &x) { this->x = x; } private: int x; }; class Bar { public: Bar(): f(genValue()){ } private: Foo f; int genValue(){ int x; // do something ... x = 1; return x; } }; int main() { Bar bar (); return 0; }
How can I fix the problem, if I don't want to modify
Foo
class and its argument value should be passed fromgenValue()
? And, I don't want to use pure pointer (*), but a solution with smart pointer is okay!