因此,根据this article,符号A()
和new A()
导致值初始化。据我了解,两种表示法都应转换为默认初始化
,如果T是没有默认构造函数或带有 用户提供或删除的默认构造函数,对象为 默认初始化;
从中它们将引起相同的行为。然后,为什么这样:
class Image
{
public:
Image();
virtual ~Image();
protected:
std::string _filePath;
protected:
// noncopyable
Image(const Image& rImg);
Image& operator=(const Image&);
bool initWithImageFileThreadSafe(const std::string& fullpath);
};
int main()
{
auto a = new Image(); //Works
auto aa = Image(); //Error: inaccessible constructor
}
答案 0 :(得分:4)
这样做的时候
auto a = new Image(); //Works
您动态创建一个Image
,并且a
用指向它的指针进行了初始化。可以,因为它是Image
的直接初始化。
这样做的时候
auto aa = Image(); //Error: inaccessible constructor
在C ++ 17之前的版本中,您调用复制初始化,该复制使用一个值初始化为临时Image
作为初始化aa
的值。由于您的副本构造函数被标记为protected
,因此实际上不允许这样做,并且会出现编译器错误。即使可以删除此副本,您仍然需要可访问的副本/移动构造函数。
在C ++ 17之后,此处实际上没有生成临时文件,并且编译器实质上将代码转换为Image aa{};
,从而使副本被删除,并且不需要可访问的副本/移动构造函数。