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' requestedp1被解析为函数声明,不是对象实例,自然没法用来拷贝构造p2。选项2(正确)
Point p1 = Point(); Point p2 = p1; //OkPoint()是明确创建临时Point对象的写法,p1通过拷贝构造(C++17后会被优化为直接初始化)得到这个临时对象,此时p1是合法的Point实例,拷贝构造p2完全没问题。选项3(正确)
Point p1; Point p2 = p1; //Ok这是默认构造对象的标准写法,
p1直接被默认构造为Point实例,后续拷贝构造p2合法。带参数构造的情况(正确)
Point p1(4); Point p2 = p1; // will workPoint p1(4);是明确的带参数构造对象,编译器不会把它解析成函数声明(函数声明的参数列表不能是单个字面量),所以p1是合法实例,拷贝构造正常执行。
内容的提问来源于stack exchange,提问作者Yuv
相关产品推荐
相关产品推荐

