【发布时间】:2016-08-25 15:23:20
【问题描述】:
在 C++17 中,可以使用instantiate objects without specifying the template types。基本上,这段代码可以编译:
std::pair p(2, 4.5); // deduces to std::pair<int, double> p(2, 4.5);
std::tuple t(4, 3, 2.5); // same as auto t = std::make_tuple(4, 3, 2.5);
所以,假设以下代码:
template<typename... Ts>
struct Foo
{
Foo(Ts&&... ts) :
ts{std::forward_as_tuple(ts...)}
{}
std::tuple<Ts...> ts;
};
int main()
{
auto f = [] { return 42; };
Foo foo{f, [] { return 84; }};
}
我应该在这样的元组声明中使用std::decay吗?
std::tuple<std::decay_t<Ts>...> ts;
因为这就是我编写函数以根据推导出的模板类型返回对象的方式:
template<typename T>
auto make_baz(T&& t) -> baz<std::decay_t<T>>;
我可以在 Foo 的构造函数中看到这种模式,它使用转发引用将值正确地传递给元组。我不确定这里的类型推导是否表现相同。
【问题讨论】:
-
为什么不加个扣分指南?
-
@cpplearner Foo 的实例化已经有类型推导。我看不出演绎指南有什么好处,还是我遗漏了什么?
标签: c++ c++17 template-argument-deduction forwarding-reference