You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++默认与拷贝构造疑问:Point p1();写法为何报错?

为什么Point p1();写法无法正常触发拷贝构造?

核心原因:C++的「最令人头疼的解析」

Point p1();根本不是定义一个默认构造的Point对象,而是被编译器当成了一个函数声明——它表示“声明一个名为p1、返回Point类型、无参数的函数”。

所以后续Point p2 = p1;会报错:编译器认为你试图把一个函数(类型是Point())转换成Point对象,这不符合类型转换规则。

逐个解析各选项:

  • 选项1(错误)

    Point p1(); 
    Point p2 = p1; //error: conversion from 'Point()' to non-scalar type 'Point' requested
    

    p1被解析为函数声明,不是对象实例,自然没法用来拷贝构造p2。

  • 选项2(正确)

    Point p1 = Point(); 
    Point p2 = p1; //Ok
    

    Point()是明确创建临时Point对象的写法,p1通过拷贝构造(C++17后会被优化为直接初始化)得到这个临时对象,此时p1是合法的Point实例,拷贝构造p2完全没问题。

  • 选项3(正确)

    Point p1; 
    Point p2 = p1; //Ok
    

    这是默认构造对象的标准写法,p1直接被默认构造为Point实例,后续拷贝构造p2合法。

  • 带参数构造的情况(正确)

    Point p1(4); 
    Point p2 = p1; // will work
    

    Point p1(4);是明确的带参数构造对象,编译器不会把它解析成函数声明(函数声明的参数列表不能是单个字面量),所以p1是合法实例,拷贝构造正常执行。

内容的提问来源于stack exchange,提问作者Yuv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:25:28