【问题标题】:C++ function signature that accepts lvalue, rvalue and rvalue ref接受左值、右值和右值引用的 C++ 函数签名
【发布时间】:2017-12-03 15:50:32
【问题描述】:

假设我有如下函数:

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

我可以接受:

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

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

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

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

这里用户不能使用&&,我宁愿&优先于lvaue

或:

print_sutff("a string"); 

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

所以我的问题是:

有没有办法让函数接受左值、& 和 && ?如果是这样,有什么方法可以根据调用的上下文确定使用哪个优先级?

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

【问题讨论】:

  • 如果您只想打印您的对象,没有理由不简单地使用const std::string &amp;
  • 你想达到什么目的?
  • const std::string 可能是最不可能成为您想要的类型。如果您的函数是一个接收器(拥有您的论点或论点副本的所有权),那么您将强制复制并使其无法从该副本移开(这意味着稍后还有另一个副本)。如果该函数不是接收器,那么您强制复制是没有好处的。
  • print_sutff中的拼写错误是故意的吗?

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


【解决方案1】:

这样做:

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

const 左值引用可以接受左值或右值。如果您不修改输入,这是一个很好的默认设置。


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

void print_stuff(std::string_view );

【讨论】:

  • 我们 17 岁,所以 void print_stuff(std::string_view stuff); :)
  • @T.C.你确定吗 ?是否有一个编译优化可以 100% 地对待这个 const& 当它可以是一个 const& 时,因为它看起来像一个 const& 是最好的东西。不涉及复制,不涉及移动,副作用为零。
  • @Barry 你似乎持有同样的观点,你愿意解释一下吗?我知道当对象的大小很小并且代码对性能不重要时,移动优先于可变引用,而左值副本优先于可变引用......但是这里我们有 const ref,那为什么不好呢?另外,当它可以是 const 时,为什么要使值副本可变?
  • @George string_viewstring 不是一回事。
  • 啊,我的错,我没有意识到你没有使用字符串,而是所有字符字符串的引用类型的奇妙可憎......我会说它与问题无关,因为我只是以字符串为例,它可能是一个数组或一个向量(将来会有array_ref/array_view)?...无论哪种方式,就我而言,答案是正确的,谢谢你非常
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多