c++之错误 : cannot bind non-const lvalue reference of type ‘int&’ to an rvalue of type ‘int’
zlslch
阅读:27
2025-02-15 21:57:57
评论:0
我需要创建一个 Bar
对象,它有一个私有(private)对象 Foo f
.
但是,Foo
的值对象参数应通过具体方法int genValue()
.
如果我初始化 f
在构造函数范围内 Bar(){...}
,编译器大喊错误,类似于没有构造函数Foo()
.
如果我这样构造 Bar(): f(genValue())
,编译器大喊错误:
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) {
^~~
示例代码:
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;
}
如果我不想修改
Foo
,如何解决此问题类及其参数值应从
genValue()
传递?而且,我不想使用纯指针(*),但是使用智能指针的解决方案是可以的!
请您参考如下方法:
一个非const
引用参数,例如 int&
, 只能引用一个“左值”,它是一个命名变量。
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());
在这种特殊情况下,由于您的类存储了构造函数参数的拷贝,因此您应该按值传递它(
int
,而不是
int&
或
const int&
)。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。