C++ 可变模板的完美转发

C++ 可变模板的完美转发,c++,variadic-templates,optional,c++17,variadic-functions,C++,Variadic Templates,Optional,C++17,Variadic Functions,我目前正在研究一些新的C++17功能,特别是std::optional,我决定尝试使用可变模板来实现最小查找函数。这就是我到目前为止所做的: 模板 Opt optional_min(Opt&&Opt){ 返回std::转发(opt); } 模板 标准::普通类型 可选最小值(Opt0&&Opt0、Opt1&&Opt1、Opts&&Opts){ 如果(!opt0&&!opt1) { 返回可选_min(std::optional(std::nullopt)、std::forward(opts)…);

我目前正在研究一些新的C++17功能,特别是
std::optional
,我决定尝试使用可变模板来实现最小查找函数。这就是我到目前为止所做的:

模板
Opt optional_min(Opt&&Opt){
返回std::转发(opt);
}
模板
标准::普通类型
可选最小值(Opt0&&Opt0、Opt1&&Opt1、Opts&&Opts){
如果(!opt0&&!opt1)
{
返回可选_min(std::optional(std::nullopt)、std::forward(opts)…);
} 
else if(opt0&!opt1)
{
返回可选的最小值(opt0,标准::转发(opts)…);
} 
否则如果(!opt0&&opt1)
{
返回可选的最小值(opt1,std::forward(opts)…);
} 
其他的
{
返回(*opt0<*opt1)?
可选最小值(opt0,标准::转发(opts)…)
:可选的最小值(opt1,标准::转发(opts)…);
}
}
int main(){
标准::可选a=9;
std::可选b=std::nullopt;
标准::可选c=4;
如果(自动x=可选的最小值(a、b、c))

std::cout可选的\u min
参数中没有一个是转发引用。它们都是右值引用

转发引用是在将参数声明为推导模板类型参数的右值引用时形成的,但这里不是这种情况。
optional\u min
的参数是对推导模板参数实例化的右值引用

为了避免这种情况,只需去掉
Opt0
Opt1
Opts
模板参数,并直接使用类型参数:

template <typename Opt0, typename Opt1, typename... Opts>
auto optional_min(Opt0&& opt0, Opt1&& opt1, Opts&&... opts) {
    //...
}
模板
自动可选_min(Opt0&&Opt0、Opt1&&Opt1、Opts&&Opts){
//...
}

如果这是您的目标,您可以使用SFINAE将类型参数限制为
std::optional
的实例化。

转发引用是一个类似
T&
Op
的引用,它已经决定了值类别。谢谢!这非常有用。实际上,我有一个问题…如果函数被赋予了一个右值参数,ho它最终会返回对对象的引用吗?我删除了那个位。你是按值返回的,所以我完全错了。
template <typename Opt0, typename Opt1, typename... Opts>
auto optional_min(Opt0&& opt0, Opt1&& opt1, Opts&&... opts) {
    //...
}