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

标签 c++

所以根据this article ,符号 A()new A() 导致值初始化。据我了解,这两种表示法都应转换为默认初始化

for if T is a class type with no default constructor or with a user-provided or deleted default constructor, the object is default-initialized;

他们应该从中引起相同的行为。那么,为什么会这样:

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
}

最佳答案

当你做的时候

auto a = new Image(); //Works

您动态创建了一个 Image 并且 a 被初始化为一个指向它的指针。这很好,因为它是 Image 的直接初始化。

当你做的时候

auto aa = Image(); //Error: inaccessible constructor

在 C++17 之前,您调用复制初始化,它使用值初始化的临时 Image 作为初始化 aa 的值。因为你的复制构造函数被标记为 protected 这实际上是不允许发生的,你会得到一个编译器错误。即使可以省略此拷贝,您仍然需要一个可访问的复制/移动构造函数。

在 C++17 之后,这里实际上没有生成临时文件,编译器基本上将代码转换为 Image aa{};,这样拷贝就被省略了,不需要可访问的拷贝/移动构造函数。

关于c++ - 使用值初始化访问构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52505119/

相关文章:

c++ - 如何使用指针从不同的函数访问局部变量?

c++ - clang 没有看到通过 typedef 引入的基类构造函数

c++ - 如何实现complx类和实现算术函数

c++ - 基于编译器选项的已编译二进制路径

c++单链表(使用结构),插入有问题

java - 持久哈希表实现

c++ - 不确定查找功能在 CPP 中如何工作

c++ - 如何使用函数原型(prototype)返回多个参数

c++ - 语法错误 : newline unexpected - QtCreator

c++ - 如何测试 gcc 编译器支持的本地语言(除了英语,如中文、印地语等)