gpt4 book ai didi

c++ - 调用者如何知道在使用 'Perfect Forwarding' 时要传递什么类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:17 25 4
gpt4 key购买 nike

我最近听说了“完美转发”(来自 Scott Meyers Effective modern C++),比如,

案例 1. 不使用 Perfect Forward

class Widget {
public:
void setName(const std::string& newName) { name = newName; }
void setName(std::string&& newName) { name = std::move(newName); }
...

案例2.使用Perfect Forward

class Widget {
public:
template<typename T>
void setName(T&& newName) { name = std::forward<T>(newName); }
...

所以现在,我知道使用完美转发有很多优势。但在情况 1 中,用户知道 setName 的参数类型是 std::string。但是,在情况 2 中,它不能。

所以我的问题是:

  1. 使用完美转发时,用户如何知道传递什么参数类型?
  2. 如何克服这个缺点?

最佳答案

您(代码的作者)必须告诉用户哪些类型是可接受的。对于您的示例中显示的代码,注释如

An object of type T shall be assignable to an lvalue of type std::string.

可能会有帮助。否则,他们将从编译器的错误消息中艰难地学习它,这确实会非常令人沮丧。

您可以使用 SFINAE 来限制可接受的 T 集,但我看不出您这样做会得到什么,除了如果您限制太多可能会阻止一些理想的优化(比如忘记允许 const char *)。它给你带来的只是用一个编译器错误(“无法将 T 分配给 std::string”)换成另一个(“没有重载调用 Widget::设置名称(T)”)。当该函数有其他过载候选者时,情况会发生变化,但话又说回来,请参阅 Scott Meyer 关于(而不是)重载完美转发器的书。

与任何强大的功能一样,不要过度使用完美转发。如果您觉得 yield 没有超过用例中的额外复杂性,请不要使用它。一个简单的“按值获取并应用 std::move”通常是一个很好且足够的替代方案。

关于c++ - 调用者如何知道在使用 'Perfect Forwarding' 时要传递什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34428696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com