接受左值,右值和右值ref的C++函数签名

Geo*_*rge 1 c++ templates metaprogramming c++17

假设我有如下函数:

print_sutff(const std::string stuff) {
    std::cout << stuff;
}
Run Code Online (Sandbox Code Playgroud)

我可以接受:

std::string
std::string&
std::string&&
Run Code Online (Sandbox Code Playgroud)

对函数代码的外观没有任何影响.

但是,可以通过多种方式调用该函数,我希望通过它实现以下行为(或尽可能接近它):

auto pass = "a string";
print_sutff(pass);
Run Code Online (Sandbox Code Playgroud)

在这里用户不能使用&&,我更愿意&优先考虑lvaue

要么:

print_sutff("a string"); 
Run Code Online (Sandbox Code Playgroud)

这里应该调用&&构造函数.

所以我的问题是:

有没有办法让函数接受左值,&和&&?如果是这样,有没有办法根据被调用的上下文优先考虑使用哪一个?

如果没有,有没有办法让函数同时接受&和&&?这意味着使用哪个签名的行为是明确定义的.

Bar*_*rry 8

这样做:

void print_stuff(std::string const& stuff) {
    std::cout << stuff;
}
Run Code Online (Sandbox Code Playgroud)

const左值参考可以接受左值或右值.如果你没有修改输入,这是一个很好的默认值.


更好的是,因为我们是C++ 17,所以更喜欢:

void print_stuff(std::string_view );
Run Code Online (Sandbox Code Playgroud)

  • @George`string_view`和`string`不是一回事. (2认同)