gpt4 book ai didi

c++ - 不从源函数返回的类中的 auto_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:16 27 4
gpt4 key购买 nike

考虑以下代码:

#include<memory>

struct A {
std::auto_ptr<int> i;
};

A F() {
A a;
return a;
}

int main(int argc, char **argv) {
A a = F();
return 0;
}

编译时我收到一个编译错误,(参见 here):

error: no matching function for call to ‘A::A(A)’
A a = F();
^

据我了解,A::A(A) 甚至不允许存在,那么编译器为什么要请求它呢?其次,为什么不使用RVO?


如果是因为std::auto_ptr不能从函数中返回,为什么下面会编译运行?

#include<memory>

std::auto_ptr<int> F() {
std::auto_ptr<int> ap;
return ap;
}

int main(int argc, char **argv) {
std::auto_ptr<int> ap = F();
return 0;
}

不幸的是,我不能在我目前的工作中使用 C++11,因此使用 auto_ptr

最佳答案

我尝试搜索但找不到相关的问答,即使我知道这是重复的。因此,我正在回答而不是投票关闭重复。抱歉。


它需要复制构造函数的原因是因为行:

A a = F();

真的(从编译器的角度):

A a(F());

即使使用复制省略/RVO。也就是说,编译器不会做:

// This is NOT what the compiler does for A a = F();
A a;
a = F();

即使使用复制省略/RVO,A a(F()); 也不会起作用。从 C++ 标准的角度来看,代码需要合法,无论编译器是否执行复制省略。复制省略并没有放松对复制构造函数的需求(即使它实际上没有使用它;它仍然需要存在以确保代码的“合法性”)。

这不起作用,因为 std::auto_ptr 的复制构造函数不采用 const 引用,所以 A' s 复制构造函数不存在。 F() 返回一个临时的 A,它只能被一个 const 引用捕获,这意味着该行代码试图使用一个不存在的复制构造函数。

关于c++ - 不从源函数返回的类中的 auto_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24072983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com