gpt4 book ai didi

c++ - 为什么我在这里需要复制构造函数

转载 作者:行者123 更新时间:2023-11-30 01:58:14 26 4
gpt4 key购买 nike

我有一个帮助类来释放 MYSQL_RES 句柄。

class auto_mysqlres
{
public:
auto_mysqlres(MYSQL_RES *res) : m_res(res)
{
}

~auto_mysqlres()
{
if (m_res != NULL)
mysql_free_result(m_res);
}

operator MYSQL_RES* ()
{
return m_res;
}

private:
auto_mysqlres& operator= (const auto_mysqlres &res);
auto_mysqlres (const auto_mysqlres &res);

private:
MYSQL_RES *m_res;
};

当我尝试以这种方式使用它时auto_mysqlres result = return_pointer_to_mysql_res();我在 GCC 4.6.3 中收到错误:auto_mysqlres::auto_mysqlres(const auto_mysqlres&) is private。不过,在 MSVC 2008 中没有错误。

return_pointer_to_mysql_res 当然返回 MYSQL_RES*我已经解决了这一行 auto_mysqlres result (return_pointer_to_mysql_res());

的问题

但我想找出为什么会出现该错误。我不明白为什么 GCC 会在那里创建一个临时对象。

最佳答案

您正在此处执行复制初始化:

auto_mysqlres result = return_pointer_to_mysql_res();

这要求复制构造函数可用,即使拷贝被省略。从语义上讲,您正在从 RHS 上的指针构造一个临时 auto_mysqlres,并在 LHS 上从它复制构造。

您可以使用直接初始化代替:

auto_mysqlres result(return_pointer_to_mysql_res());

查看更多信息 copy initialization and direct initializazion here .

正如@Rapptz 在评论中指出的那样,在 C++11 中,您可以决定让您的类移动可复制(并且可能移动可分配),在这种情况下,移动复制构造函数将在复制初始化中被选取。

关于c++ - 为什么我在这里需要复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17676440/

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