c++ - Herb Sutter 的 C++Con 2014 演讲中的完美转发器

标签 c++ language-lawyer rvalue-reference function-templates

Herb Sutter's talk在 C++Con 2014 上,他讨论了值传递、引用传递等等。他在这个人为设计的示例中展示的一项技术是:

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...并希望得到解释以破译其目的。 noexcept如何工作?如果一个人天真地写下会出什么问题:

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

最佳答案

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

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

关于c++ - Herb Sutter 的 C++Con 2014 演讲中的完美转发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370418/

相关文章:

c++ - 为什么我们需要在 move 构造函数中将右值引用设置为空?

c++ - friend 库功能可以访问子数据

c++ - 未解析的外部符号(OpenGL 和 C++)

c++ - 为什么 C++ 标准定义了 cv 限定符的偏序?

c - 退出状态是可观察的行为吗?

c++ - 所有 std::tuple 构造函数都是必需的吗?

c++ - 成员函数返回成员变量的右值引用

c++ - boost::make_shared 导致访问冲突

渲染器和对象之间的 C++ SFML 段错误

c - 为什么我不能检索我的灵活数组成员大小?