使用“auto”进行初始化需要复制构造函数

initialization with `auto` needs copy constructor?

本文关键字:复制 构造函数 初始化 auto 使用      更新时间:2023-10-16

以下初始化,

auto p = std::make_pair(std::stringstream{}, "Hello World!");

使用CCD_ 2编译并与CCD_。

然而,使用libstdc++编译它时,clang++g++、都会出现错误

error: use of deleted function 'std::basic_stringstream<char>::basic_stringstream(const std::basic_stringstream<char>&)'

来自g++

error: call to implicitly-deleted copy constructor of 'std::basic_stringstream<char>'

使用CCD_ 8从CCD_。

我对标准的理解是,这种类型的声明加初始化不应该涉及复制构造函数。我错了吗?libc++是否应该允许这种初始化?或者clang++0不正确?

EDIT:在你回复后,我知道这是gcc中的一个错误,要到v5才能修复。无论是使用复制初始化还是直接初始化,调用make_pair总是需要一个移动或复制构造函数,这在当前有缺陷的gcc下会出错。因此,我的问题是如何轻松地重写我的代码以规避错误。我有一个类层次结构,它有一个类型为stringstream的成员。去掉它会引起太多的头痛。使用unique_ptr是唯一的方法吗?

这是复制初始化,必须有一个可访问的构造函数将转换后的值转移到新对象中。

但是,应该选择move构造函数。(假设您的libstdc++副本足够新,可以为std::pair提供一个)

无论如何,最好使用直接初始化:

auto p(std::make_pair(std::stringstream{}, "Hello World!"));