【发布时间】: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 &。 -
你想达到什么目的?
-
const std::string可能是最不可能成为您想要的类型。如果您的函数是一个接收器(拥有您的论点或论点副本的所有权),那么您将强制复制并使其无法从该副本移开(这意味着稍后还有另一个副本)。如果该函数不是接收器,那么您强制复制是没有好处的。 -
print_sutff中的拼写错误是故意的吗?
标签: c++ templates metaprogramming c++17