1)
template<typename T, typename Arg>
shared_ptr<T> factory(Arg arg)
{
return shared_ptr<T>(new T(arg));
} 2)
template<typename T, typename Arg>
shared_ptr<T> factory(Arg& arg)
{
return shared_ptr<T>(new T(arg));
} 3)
template<typename T, typename Arg>
shared_ptr<T> factory(Arg const & arg)
{
return shared_ptr<T>(new T(arg));
} *)为何3号比1号和2号更可取?
*)如果调用工厂(41),为什么在rvalue上调用?
*)#定义BOOST_ASIO_MOVE_ARG(类型)类型&&。什么是&在这种情况下?
发布于 2013-08-31 02:13:01
实际上,方法3并不比1和2好,这都取决于T的构造函数。
要做到这一点,一个有点标准的方法是使用rvalue引用,这是您提到的&&。
因此,一个更好的工厂应该是这样的:(这就是完美的转发实际上是什么)
template<typename T, typename Arg>
std::shared_ptr<T> factory(Arg && arg)
{
return std::shared_ptr<T>(new T (std::forward<Arg>(arg)));
}由于C++的引用折叠规则,这个函数可以同时接受(和向前) rvalue参考和lvalue引用,也就是说,如果将rvalue传递给T的构造函数,它将忠实地将rvalue转发给T的构造函数,如果给它一个lvalue,则这两种引用(Something & && arg)将崩溃,并且lvalue引用将被转发给底层构造函数。
我想我已经回答了你的问题,但是要明确地回答,
factory函数的const&和&重载。const&版本更好,它实际上将接受临时值,但是如果基础T类型有一个接受非const的构造函数,那么您将得到一个编译错误,因为const&不是隐式地传递给&的。41的地址(这在技术上并不是100%正确的,但我认为以这种方式考虑lvalue和rvalue是可以的。)rvalue reference。你需要阅读这方面的内容;一个解释在这里是不合适的,而且已经有几个很棒的解释,只要谷歌搜索就可以了!UPDATE:正如注释中所提到的,使用make_shared可能比使用公正-newed指针构造shared_ptr更好。make_shared可以通过分配控制块(其中包括引用计数)和对象本身来获得更高的效率,这将在访问引用计数器和对象时提供更好的缓存局部性,还可以节省一个内存分配。即使实现没有任何优化,它也不会比上面的版本更糟糕。因此,只要有可能就使用std::make_shared!你在这里就是这样做的:
template<typename T, typename Arg>
std::shared_ptr<T> factory (Arg && arg)
{
return std::make_shared<T>(std::forward<Arg>(arg));
}发布于 2013-08-31 02:12:05
*)为何3号比1号和2号更可取?
(1)如果Arg不可复制,则无法工作。(2)不允许您传递一个rvalue,如在factory<int>(42);中
请注意,这三个例子中没有一个涉及完美转发。我不知道你问题的主题是指什么。
*)如果调用工厂(41),为什么在rvalue上调用?
我不太明白这个问题。从定义上来说,41是一个rvalue。
*)#定义BOOST_ASIO_MOVE_ARG(类型)类型&&。什么是&在这种情况下?
type&&是R值参考 to type。
https://stackoverflow.com/questions/18543717
复制相似问题