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

时间:2017-06-29 19:42:36

标签: c++ templates metaprogramming c++17

假设我有以下功能:

print_sutff(const std::string stuff) {
    std::cout << stuff;
}

我可以接受:

std::string
std::string&
std::string&&

对功能代码的外观没有任何影响。

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

auto pass = "a string";
print_sutff(pass);

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

或:

print_sutff("a string"); 

这里&amp;&amp;应该调用构造函数。

所以我的问题是:

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

如果没有,是否有任何方法可以使功能同时接受&amp;和&amp;&amp; ?这意味着使用哪个签名的行为是明确定义的。

1 个答案:

答案 0 :(得分:8)

这样做:

void print_stuff(std::string const& stuff) {
    std::cout << stuff;
}

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

Even better,因为我们是C ++ 17,所以更喜欢:

void print_stuff(std::string_view );