如何接受rvalue和lvalue非常量参数类型

时间:2018-11-21 22:48:22

标签: c++11 rvalue-reference pass-by-rvalue-reference

我反复遇到接受非常量引用参数的问题,因为似乎采用rvalue参数会阻止接受lvalue,反之亦然。这是一个例子

void read(File &file)// I want to modify file
{
    SomeClass someObject;
    file.readInto(&someObject);//readInto is a non-const method
    // do something with the data populated in someObject
}

但是当我尝试调用read时,如果尝试两种不同的调用约定,就会遇到问题

//this works just fine
File f1 = File::open("some_file_path");
read(f1);

// However this fails
read( File::open("some_file_path") );//because open returns an rvalue

我遇到的问题是,如果我将参数更改为非常量rvalue,而无法再传递lvalue。我是否注定总是提供一个带有rvalue引用类型的覆盖(或模板),并简单地调用lvalue覆盖?

1 个答案:

答案 0 :(得分:1)

自您更新问题以来,我建议您这样做:

void read(File& file)
{
    SomeClass someObject;
    file.radInto(&someObject);
    // ...
}

void read(File&& file) { read(file); }

这将以最少的代码重复处理左值和右值。


我认为您的read函数应该只使用File&

void read(File& file) // I want to modify file
{
    SomeClass someObject;
    file.readInto(&someObject);//Modifies file
    // do something with the data populated in someObject
}

然后您可以致电:

// OK
std::shared_ptr<File> f1 = File::open("some_file_path");
read(*f1);

// OK
read( *File::open("some_file_path") );

增加的好处:该函数不仅限于shared_ptr,并且可以与任何File一起使用,而与其内存管理方式无关。


或者,使用转发参考

template <typename T>
void read(T&& file)// I want to modify file
{
    SomeClass someObject;
    file->readInto(&someObject);//Modifies file
    // do something with the data populated in someObject
}