【发布时间】:2017-10-09 16:23:11
【问题描述】:
我认为我从根本上误解了关于 std::forward 的一些东西。看看下面的代码——如果我包含 std::forward,它不会编译,但如果它被省略,它编译得很好。 std::forward 的意义不是它可以推断出是否需要推送 l 或 rvalue 吗?
#include "boost/optional.hpp"
#include "iostream"
template<typename T>
bool hasArg(const boost::optional<T>& opts)
{
if (opts)
{
return true;
}
else
{
return false;
}
}
template<typename T, typename ... Ts>
bool hasArg(const boost::optional<T> & opts,const boost::optional<Ts> & ... rest)
{
if (opts) {
//doesn't work: return hasArg<Ts...>(std::forward<Ts>(rest)...);
//works: return hasArg<Ts...>(rest...);
return hasArg<Ts...>(rest...);
}
else
{
return false;
}
}
int main()
{
const boost::optional<int> p = boost::optional<int>(5);
const boost::optional<int> q = boost::optional<int>(6);
std::cout << hasArg(p, q) << std::endl;
return 0;
}
【问题讨论】:
-
与您的问题无关,但您可能应该找到解释(不正确)
#include "iostream"和(正确)#include <iostream>之间区别的地方。 -
std::forward应该(仅?)与转发引用一起使用。即使您修复了语法,它在这里也不起作用。