当调用move构造函数时 我想知道在C++代码中何时调用构造函数。< /P>

当调用move构造函数时 我想知道在C++代码中何时调用构造函数。< /P>,c++,c++11,constructor,C++,C++11,Constructor,这意味着,我知道当我调用fooa(b)时,它是复制构造函数,所以我必须编写什么代码才能调用移动构造函数。移动构造函数只是另一个构造函数。如果有重载构造函数,就像重载任何其他函数一样,调用哪个构造函数取决于重载解析规则。也就是说,当您使用fooa()构造对象时,可能有多个可能的构造函数,需要选择一个 复制构造函数接受一个类型为constfoo&的参数。此左值引用类型将绑定到表示Foo对象的任何表达式。move构造函数接受一个Foo&类型的参数。此右值引用将仅绑定到可修改的右值。事实上,在传递可修改

这意味着,我知道当我调用
fooa(b)
时,它是复制构造函数,所以我必须编写什么代码才能调用移动构造函数。

移动构造函数只是另一个构造函数。如果有重载构造函数,就像重载任何其他函数一样,调用哪个构造函数取决于重载解析规则。也就是说,当您使用
fooa()构造对象时,可能有多个可能的构造函数,需要选择一个

复制构造函数接受一个类型为
constfoo&
的参数。此左值引用类型将绑定到表示
Foo
对象的任何表达式。move构造函数接受一个
Foo&
类型的参数。此右值引用将仅绑定到可修改的右值。事实上,在传递可修改的右值的情况下,最好使用此重载


这意味着在
fooa()
如果表达式
是可修改的右值,则将选择移动构造函数。否则将选择复制构造函数。可修改的右值通常在表示临时对象(例如,从函数返回的对象)时出现。还可以通过使用
std::move
,例如
fooa(std::move(b)),将表达式强制为右值表达式

一般来说,我们必须给出一个
rvalue
引用参数来说明它。例如:

template<class T>
void swap(T& a, T& b)
{
  T tmp = std::move(a);
  a = std::move(b);
  b = std::move(tmp);
}
模板
无效掉期(T&a、T&b)
{
T tmp=std::move(a);
a=标准::移动(b);
b=标准::移动(tmp);
}
move()
是一个标准库函数,返回对其参数的右值引用
move(x)
的意思是“给我一个对x的右值引用”。也就是说,
std::move(x)
不移动任何东西,而是允许用户移动x


源代码:C++编程语言(B. Stroustrup)

答案将帮助你。在你的FooA(b)的例子中,<代码> b>代码>是一个命名对象,因此它不能是一个rValue.
std::move(b)
在这里是必需的。@MichaelGazonda我把
b
当作一个通用表达式,而不是专门的
b
。我会说清楚的。