【发布时间】:2014-08-21 05:58:14
【问题描述】:
考虑一下这段代码的 sn-p,它使用常见的习惯用法是让函数模板构造一个专门针对推导类型的类模板的实例,如 std::make_unique 和 std::make_tuple 所示,例如:
template <typename T>
struct foo
{
std::decay_t<T> v_;
foo(T&& v) : v_(std::forward<T>(v)) {}
};
template <typename U>
foo<U> make_foo(U&& v)
{
return { std::forward<U>(v) };
}
在斯科特迈耶斯的“普遍参考”的背景下,论点
make_foo 是一个通用引用,因为它的类型是 U&& 其中 U 是
推断。 foo 的构造函数的参数不是通用引用
因为虽然它的类型是T&&,但T(通常)没有被推断出来。
但是在foo的构造函数被make_foo调用的情况下,它
在我看来,考虑构造函数的参数可能是有意义的
foo 作为通用参考,因为 T 已由
函数模板make_foo。相同的参考折叠规则将适用
这样v 的类型在两个函数中是相同的。在这种情况下,T
而U可以说是推导出来的。
所以我的问题是双重的:
- 将
foo的构造函数的参数认为是 在推断出T的有限情况下的通用参考 在调用者的通用引用上下文中,如我的示例所示? - 在我的示例中,
std::forward的两种用法都合理吗?
【问题讨论】:
标签: c++ c++11 language-lawyer perfect-forwarding universal-reference