在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 工作:如果 decay
String
模板参数的结果与 std::string
的类型不同, enable_if_t
将无法通过类型检查,因此将从候选集中删除该模板。
关于c++ - Herb Sutter 的 C++Con 2014 演讲中的完美转发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370418/