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& )。


标签:C++
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号