C++11 使用可变模板和移动语义

C++11 使用可变模板和移动语义,c++11,variadic-templates,move-semantics,C++11,Variadic Templates,Move Semantics,我试着把我的头绕在可变模板上, 移动语义,(可能是完美的转发?), 并学习如何将变量向下传递到不同的函数 比方说,有一个类Foo,它包含一个Elem(模板化)类实例数组。 这些数组元素定期重新初始化(因此使用Elem.init函数) 下面,我尝试用三个大字符串(或实现移动语义的任何其他大对象)将一个元素初始化到存储它们的确切位置: 在Foo的数组中的某个位置 甚至可以立即将它们移动到Foo的向量位置吗? 或者它将永远是“复制语义”而不是移动 总的来说,我试图避免复制大的堆栈分配字符串,并以某种方

我试着把我的头绕在可变模板上, 移动语义,(可能是完美的转发?), 并学习如何将变量向下传递到不同的函数

比方说,有一个类Foo,它包含一个Elem(模板化)类实例数组。 这些数组元素定期重新初始化(因此使用Elem.init函数)

下面,我尝试用三个大字符串(或实现移动语义的任何其他大对象)将一个元素初始化到存储它们的确切位置: 在Foo的数组中的某个位置

甚至可以立即将它们移动到Foo的向量位置吗? 或者它将永远是“复制语义”而不是移动

总的来说,我试图避免复制大的堆栈分配字符串,并以某种方式使它们位于目标向量的位置。 不确定什么是最好的方法

(目前我得到的只是一个分段错误)

谢谢你的阅读! 网上代码如下:

#包括
#包括
#包括
类元素
{
公众:
void init(std::string&&s1、std::string&&s2、std::string&&s3)
{
s1=标准::移动(s1);
s2=标准::移动(s2);
s3=标准::移动(s3);
std::cout要正确地“调试”这些问题,您可能需要编写一个包含复制和移动构造函数、析构函数和复制和移动赋值运算符的类,这些运算符声明正在执行它们。然后您可以在传递和/或创建这些值时告诉它们发生了什么

无论如何,您正在使用三个
std::string&
参数调用
add()
方法。但是-在函数内部,一旦它们绑定到
args…
,它们现在就是左值!您需要在
add()
方法中使用
std::move()

template <typename... Args>
void add(Args... args)
{
    mElements[mNextFreeIndex].init(std::move(args)...);
    mNextFreeIndex++;
}
模板
无效添加(Args…Args)
{
MELENTS[MNEXTFREINDEX].init(std::move(args)…);
mNextFreeIndex++;
}
或申请转发:

template <typename... Args>
void add(Args&&... args)
{
    mElements[mNextFreeIndex].init(std::forward<Args>(args)...);
    mNextFreeIndex++;
}
模板
无效添加(Args&&…Args)
{

MELENTS[MNEXTFREINDEX].init(std::forward关于这两个术语的用法。

还有一个问题:要么我使用std::move everywhere,要么我使用std::forward,那么我应该混合使用它们吗?@Avi:这里没有一些通用规则可以给你。转发适用于那些需要相同代码来处理右值和左值引用的情况。如果你找到你的话如果你移动了很多或者转发了很多,那么-也许你应该努力减少代码层。
template <typename... Args>
void add(Args&&... args)
{
    mElements[mNextFreeIndex].init(std::forward<Args>(args)...);
    mNextFreeIndex++;
}