我有这个示例程序:
#include <iostream>
template<typename Message, typename Decoration, typename PrintImpl>
void print_surrounded(Message&& msg, const Decoration& decoration, const PrintImpl& print_impl)
{
print_impl(decoration); // should forward be used?
print_impl(" ");
print_impl(std::forward<Message>(msg));
print_impl(" ");
print_impl(decoration);
}
template<typename Message, typename PrintImpl>
void pretty_print(Message&& msg, const PrintImpl& print_impl)
{
print_surrounded(std::forward<Message>(msg), "***", print_impl);
}
int main()
{
pretty_print("So pretty!", [](const char* msg) {
std::cout << msg;
});
}
如您所见,我使用不同的方式传递参数:
&&
吗?如果是,我还应该使用std::forward
吗?)我做出了正确的选择吗?
答案 0 :(得分:4)
我做出了正确的选择吗?
是(大部分)。
装饰被捕获为const ref,因为它的值被使用了两次而且我不确定使用前进两次是否安全。 (可能会被第一个前锋搬走?)
多次执行此操作时请勿使用std::forward
,这完全是出于您的布局原因。
PrintImpl被捕获为const引用,因为我没有看到任何使用前向的理由。
您可能想要做的是PrintImpl&&
并且不要使用std::forward
(将它们保持为左值),允许没有const
的合格operator()
的函数对象通过了。