出生的牛犊还是怕虎 2024-06-30 22:20 采纳率: 100%
浏览 9
已结题

关于#c++#的问题:但是编译器始终一根筋调用左值拷贝构造函数,我将c++的标准换到17甚至跟高,依旧一根筋调用左值拷贝构造函数(相关搜索:编译环境)

编译环境:VS2017
我在类里面已经将左值构造函数删掉,且右值构造函数是默认选项(使用unique_ptr)。但是编译器始终一根筋调用左值拷贝构造函数,我将c++的标准换到17甚至跟高,依旧一根筋调用左值拷贝构造函数。这个图是输出的问题。

img


这是result类

img

这是Any类,拼图

img

img

以下是调用出错的地方

img

对于涉及到对右值函数的使用都是使用std::move()

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-30 22:20
    关注

    引自免费微信小程序:皆我百晓生

    了解了你的问题,让我们一步步来解决它。首先,我会根据你提供的代码片段和错误信息,尝试理解问题的本质。然后,我会给出可能的解决方案。

    问题分析:

    从错误信息来看,编译器在尝试调用 Result 类的拷贝构造函数时遇到了问题。错误指出 Result 类因为内部成员 Any 的拷贝构造函数被删除而不能进行拷贝构造。另外,图 2 中的 Result 类代码中提到了 Any 类的一些内容,所以问题可能与这两个类的交互有关。具体的问题可能是以下几点:

    1. 拷贝构造函数的隐式删除:当 Any 类的拷贝构造函数被显式删除时,任何尝试调用拷贝构造函数的类(如 Result)都会受到影响。如果 Result 类中使用了 Any 类型的成员变量,编译器在生成 Result 的拷贝构造函数时可能会尝试调用 Any 的拷贝构造函数,从而导致错误。
    2. 右值引用的使用:虽然你提到了右值构造函数并使用 std::unique_ptr,但可能并没有正确处理移动语义或避免不必要的拷贝。移动语义主要用于资源移动而非对象拷贝的场景。如果代码中逻辑错误或者不当使用移动语义,也可能导致问题。

    可能的解决方案:

    针对 Result 类:

    • 检查 Result 类中的代码,确保没有不必要地调用拷贝构造函数。例如,在初始化成员变量或传递参数时避免不必要的拷贝。
    • 如果不需要拷贝 Result 对象,可以考虑删除其拷贝构造函数和赋值操作符。这可以通过在类定义中添加以下代码实现:
    Result(const Result&) = delete;
    Result& operator=(const Result&) = delete;
    

    这样,编译器就会禁止自动生成拷贝构造函数和赋值操作符。这可以防止误用并导致不必要的错误。但是,请谨慎操作,确保确实不需要拷贝功能。如果还需要保持某些复制功能,那么你需要自己实现拷贝构造函数和赋值操作符。确保正确处理所有相关的依赖项(如 Any 类型)。

    针对 Any 类:

    • 检查 Any 类的定义和实现,确保拷贝构造函数和赋值操作符的行为符合预期。如果它们不应该被复制或赋值,确保这些操作已经被正确处理(例如通过删除相关函数)。如果它们应该被允许复制或赋值,确保正确处理相关的资源管理和类型转换逻辑。特别是要注意动态类型转换部分(在图 4 中提到),确保类型转换逻辑正确且不会导致异常。此外,还要检查是否所有成员变量都正确处理了拷贝和移动语义。如果有依赖其他类(如智能指针),确保这些依赖类也正确处理了拷贝和移动语义。

    补充说明:关于移动语义和智能指针的使用:

    对于现代 C++ 代码(尤其是使用智能指针的资源管理),通常推荐使用移动语义而非拷贝语义。这样可以减少资源管理的复杂性并提高性能。在使用智能指针时,要确保理解其工作原理以及如何正确地在类中使用它们。移动语义主要涉及将资源从一个对象移动到另一个对象而不是复制它们。在适当的情况下使用移动构造函数和移动赋值操作符可以充分利用这一特性。然而,这需要谨慎处理以避免逻辑错误和资源泄漏等问题。在决定使用移动语义之前,请确保了解潜在的风险和好处,并进行充分的测试以确保代码的正确性和健壮性。如果你不确定如何正确应用这些概念,建议进一步研究或寻求专业帮助以避免潜在问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月10日
  • 已采纳回答 7月2日
  • 修改了问题 6月30日
  • 创建了问题 6月30日

悬赏问题

  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊