当我 return 来自函数的自动变量时,为什么复制构造函数不工作?
Why doesn't the copy constructor work when I return an automatic variable from function?
在下面的示例中,我想找出为什么当我 return 来自 doit() 函数的自动变量时没有调用复制构造函数。我知道调用处理程序的第一个版本是因为我们有一个临时对象,但无法弄清楚为什么在创建该临时对象时不调用复制构造函数(将所有内容从 s 复制到临时对象)。
#include <iostream>
using namespace std;
class S{
public:
S(){std::cout<<"Constructor\n";}
S(const S& s){std::cout<<"Copy Constructor\n";}
~S(){std::cout<<"Destructor\n";}
};
S doit(){
S s;
return s;
}
void handler(S&& r){
std::cout<<"Here\n";
}
void handler(const S& r){
std::cout<<"Here2\n";
}
int main() {
handler(doit());
}
实际上,根据语言的规则,在您的代码中调用了一个构造函数。但是,编译器已对其进行优化,因此您看不到该调用。如果你用 -fno-elide-constructors
编译,你应该看到 copy-constructor 被调用。
请注意,copy-constructor 只会被调用,因为默认的 move-constructor 被抑制了。如果你像这样把它加回去:
S(S&&) = default;
然后这个 move-constructor 将被调用。这是 demo.
在下面的示例中,我想找出为什么当我 return 来自 doit() 函数的自动变量时没有调用复制构造函数。我知道调用处理程序的第一个版本是因为我们有一个临时对象,但无法弄清楚为什么在创建该临时对象时不调用复制构造函数(将所有内容从 s 复制到临时对象)。
#include <iostream>
using namespace std;
class S{
public:
S(){std::cout<<"Constructor\n";}
S(const S& s){std::cout<<"Copy Constructor\n";}
~S(){std::cout<<"Destructor\n";}
};
S doit(){
S s;
return s;
}
void handler(S&& r){
std::cout<<"Here\n";
}
void handler(const S& r){
std::cout<<"Here2\n";
}
int main() {
handler(doit());
}
实际上,根据语言的规则,在您的代码中调用了一个构造函数。但是,编译器已对其进行优化,因此您看不到该调用。如果你用 -fno-elide-constructors
编译,你应该看到 copy-constructor 被调用。
请注意,copy-constructor 只会被调用,因为默认的 move-constructor 被抑制了。如果你像这样把它加回去:
S(S&&) = default;
然后这个 move-constructor 将被调用。这是 demo.