相关疑难解决方法(0)

接受左值和右值参数的函数

有没有办法在C++中编写一个接受左值和右值参数的函数,而不是模板?

例如,假设我编写了一个print_stream从a 读取istream并打印读取到屏幕的数据的函数.

我认为print_stream像这样打电话是合理的:

fstream file{"filename"};
print_stream(file);
Run Code Online (Sandbox Code Playgroud)

以及像这样:

print_stream(fstream{"filename"});
Run Code Online (Sandbox Code Playgroud)

但是我如何声明print_stream这两种用途都有效呢?

如果我声明它

void print_stream(istream& is);
Run Code Online (Sandbox Code Playgroud)

然后第二次使用将无法编译,因为rvalue不会绑定到非const左值引用.

如果我声明它

void print_stream(istream&& is);
Run Code Online (Sandbox Code Playgroud)

然后第一次使用将无法编译,因为左值不会绑定到右值引用.

如果我声明它

void print_stream(const istream& is);
Run Code Online (Sandbox Code Playgroud)

那么函数的实现将无法编译,因为你无法读取const istream.

我不能使该函数成为模板并使用"通用引用",因为它的实现需要单独编译.

我可以提供两个重载:

void print_stream(istream& is);
void print_stream(istream&& is);
Run Code Online (Sandbox Code Playgroud)

并且第二次调用第一次,但这似乎是很多不必要的样板,并且我发现每次用这样的语义编写函数时都必须这样做非常不幸.

我能做些什么吗?

c++ function rvalue lvalue c++11

33
推荐指数
5
解决办法
5522
查看次数

标签 统计

c++ ×1

c++11 ×1

function ×1

lvalue ×1

rvalue ×1