用`auto`初始化需要复制构造函数?

时间:2015-02-17 16:23:38

标签: c++ c++11 copy-constructor auto

以下初始化,

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

使用clang++编译并使用libc++正常工作。

使用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>'

来自clang++使用libstdc++

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

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

1 个答案:

答案 0 :(得分:2)

那就是复制初始化,必须有一个可访问的构造函数来将转换后的值传递给新对象。

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

在任何情况下,最好使用直接初始化:

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