使用值初始化访问构造函数?

时间:2018-09-25 19:01:05

标签: c++

因此,根据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
}

1 个答案:

答案 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{};,从而使副本被删除,并且不需要可访问的副本/移动构造函数。