【发布时间】:2015-02-17 16:23:37
【问题描述】:
下面的初始化,
auto p = std::make_pair(std::stringstream{}, "Hello World!");
使用libc++ 编译并与clang++ 正常工作。
但是,使用 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 是唯一的方法吗?
【问题讨论】:
-
可能libstdc++没有更新到c++11
-
@Cheersandhth.-Alf 看起来像gcc bug 54316,应该在 gcc 5 (o.O) 中修复
-
@Cheersandhth.-Alf:libstdc++ 在很长一段时间内(大约八年)中有 lot 的 C++11。但是还是有几个坑。您不会一次性获得整个新标准。
标签: c++ c++11 copy-constructor auto