Herb Sutter 的 C++Con 2014 演讲中的完美货运代理

Perfect forwarder in Herb Sutter's C++Con 2014 talk

本文关键字:完美 货运代理 2014 Sutter C++Con Herb      更新时间:2023-10-16

在2014年C++大会上Herb Sutter的演讲中,他讨论了通过值传递、通过引用传递等等。他在这个看似做作的例子中提出的一种技术是:

using namespace std;
class employee{
    string name_;
public:
    template<class String, class = enable_if_t<!is_same<decay_t<String>, string>::value>>
    void set_name(String&& name) noexcept(is_nothrow_assignable<string&, String>::value){
        name_ = forward<String>(name);
    }
};

我理解String&&通用转发引用,因为String是推导的模板类型,因此应该使用forward<String>(name)。虽然我在模板元编程方面的经验非常有限,但我不清楚enable_if_t...中未修改的tempate参数的目的是什么,希望能对其目的进行解释。noexcept是如何工作的?如果有人天真地写道:

template<class String>
void set_name(String&& name){
    name_ = forward<String>(name);
}

这是为了确保仅使用对std::string的l值或r值引用来调用set_name,从而允许使用任何cv限定符。

它使用SFINAE工作:如果String模板参数的decay的结果与std::string的类型不同,则enable_if_t将无法通过类型检查,因此模板将从候选集中删除。

由于使用了std::enable_if_t,因此需要此未命名的模板参数。不需要参数(在模板函数中使用),因此可以对其进行命名。

CCD_ 13使用SFINAE工作。如果std::enable_if_t的参数为false,则不会为该参数生成函数代码。

有关std::enable_if_t的更多信息,请参阅一些文档。您还可以查看TemplateMetaProgramming的wikibook或SFINAE和enable_if文章。