我了解在通常情况下完美转发的工作原理:
template <typename T>
void f(T &&arg) {
E(std::forward<T>(arg)));
}
是否可以完美地转发“非通用”类型,例如某种形式的std::string
不使用 SFINAE 或编写多个版本?
/* Likely some kind of template. */
/* template <typename T> */
void f(/* Something goes here*/ arg) {
E(std::forward</* Something goes here. */>(arg);
}
以下应该是正确的:
f(std_str_obj); // Lvalue forwarded as const lvalue ref.
f("hello"); // Temporary forwarded as rvalue reference.
f(1); // Error, not a std::string or convertible to std::string.
我怀疑唯一的方法是仍然编写一个函数模板并使用某种形式的 SFINAE 来限制它(在这种情况下我可以自己想办法),但我想知道是否有一些简单的方法可以让我我失踪了。