【发布时间】:2013-06-26 09:31:07
【问题描述】:
我想开发一个带有类型擦除的小型多态类,我想知道哪个版本的模板化构造函数更好,应该使用。
我们可以传值:
class A
{
...
template< typename T >
A( T t ) { /* create the underlying model via std::move */ }
...
};
或者我们可以使用通用引用:
class A
{
...
template< typename T >
A( T &&t ) { /* create the underlying model via std::forward */ }
...
};
(如果T 不是类本身且类未被复制,则必须启用通用引用)。有任何想法吗?两个版本看起来都和我一样。
【问题讨论】:
-
这当然取决于
t内部发生了什么。但我真的想不出你为什么选择第一个选项。这意味着在构造函数中制作t的本地副本——即使您最终制作了一个永久副本(在数据成员中),为什么还想要一个本地副本? -
不,在第一个版本中你可以移动 t。
-
@jogojapan 阅读了我发布的链接:如果您仍然要进行复制,那么使用传递值实际上是有意义的
-
@stijn 不确定你到底指的是什么。但请注意,我说的是函数本地副本与数据成员中的副本。仅仅为了制作另一个副本(到数据成员中)而制作一个函数本地副本是没有意义的。至少乍一看不是。
标签: c++ pass-by-value forwarding-reference pass-by-rvalue-reference