模板和使用rvalues引用作为参数

时间:2014-07-20 20:45:34

标签: c++ templates rvalue-reference pass-by-rvalue-reference

所以我有一个名为std::map< std::string, boost::any >的{​​{1}},我想创建一个接受任何类型(因此是模板)的函数并将其存储在地图中。 下一个代码会起作用吗?

OptionsMap

2 个答案:

答案 0 :(得分:3)

通常,当函数模板接受通用引用(即推导类型的右值引用)时,应该使用forward转换函数参数,以便获得与提供的值相同的值类别通过函数调用中的参数:

template <typename T>
void Set(std::string optionName, T&& optionValue)
{
    OptionsMap[optionName] = std::forward<T>(optionValue);
    //                       ^^^^^^^^^^^^^^^
}

参数变量optionValue本身始终是一个左值,因此如果没有强制转换,您将复制应该移动的内容。如果类型是可复制的,那么效率将低于预期;如果类型不可复制(例如unique_ptr),那就更糟了:你的函数现在接受一个参数,它随后将无法编译。

答案 1 :(得分:1)

当然。为什么它不起作用?

boost::any::operator=接受满足ValueType的任何数据类型的参数。

boost::any开始支持移动语义时,我只需按值移动它,以获得向前兼容性。

template <typename T>
void Set(std::string optionName, T optionValue)
{
    OptionsMap[optionName] = std::move(optionValue);
}

将rvalue传递给此函数会在可移动时将其移动。这是由标准保证的。