我反复遇到接受非常量引用参数的问题,因为似乎采用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覆盖?
答案 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
}