传递模板args由const&或者&&

时间:2013-07-25 09:24:07

标签: c++ c++11

我有这个示例程序:

#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;
    });
}

I also posted it on Coliru.

如您所见,我使用不同的方式传递参数:

  • 消息作为通用引用传递,因为它最终需要转发到PrintImpl函数。
  • 装饰作为const ref在这里传递,因为它的值被使用了两次,我不确定使用前进两次是否安全。 (可能会被第一个前锋搬走?)
  • PrintImpl作为const引用传递,因为我没有看到任何使用forward的理由。但是,我不确定这是否明智。 (我应该经过&&吗?如果是,我还应该使用std::forward吗?)

我做出了正确的选择吗?

1 个答案:

答案 0 :(得分:4)

  

我做出了正确的选择吗?

是(大部分)。

  

装饰被捕获为const ref,因为它的值被使用了两次而且我不确定使用前进两次是否安全。 (可能会被第一个前锋搬走?

多次执行此操作时请勿使用std::forward,这完全是出于您的布局原因。

  

PrintImpl被捕获为const引用,因为我没有看到任何使用前向的理由。

您可能想要做的是PrintImpl&&并且不要使用std::forward(将它们保持为左值),允许没有const的合格operator()的函数对象通过了。