【发布时间】:2014-12-23 19:39:52
【问题描述】:
我正忙于测试各种通用算法的实现,并且我正在使用对所提供函数的支持最少的类型。我在使用带有某种类型 T(例如 int)的 std::pair<T, movable> 和定义如下的 movable 类型时遇到了这种奇怪的设置:
struct movable
{
movable() {}
movable(movable&&) = default;
// movable(movable const&) = delete;
movable(movable&) = delete;
};
这个想法是有一个可移动但不可复制的类型。这很好用,例如,使用这样的表达式:
movable m1 = movable();
movable m2 = std::move(m1);
但是,当尝试将此类型用作std::pair<...> 的成员时,它会失败!要编译代码,必须添加 deleted(!) 复制构造函数,采用 movable const&(或只有该版本)。采用非const 引用的复制构造函数不足:
#include <utility>
auto f() -> std::pair<int, movable> {
return std::pair<int, movable>(int(), movable());
}
这里发生了什么?通过强制将 std::pair(std::pair const&) 指定为 = defaulted 是否过度指定了 std::pair<...>?
问题似乎归结于std::pair 的复制构造函数的规范(在 20.3.2 [pairs.pair] 概要中):
namespace std { template <class T1, class T2> struct pair { ... pair(const pair&) = default; ... }; }
快速检查我的实现意味着复制两个成员的明显实现不需要const& 版本的movable 复制构造函数。也就是说,冒犯的部分是pair的复制构造函数上的= default!
【问题讨论】:
-
@Borgleader:我同意它是相关的,但这个问题并没有解决
= default被强制成为问题的问题! ...或者,就此而言,为什么使用= default实际上会导致这个问题。该问题的拟议解决方案还保留了冒犯性的pair(pair const&) = default。 -
@Dietmar:我对那个问题/答案的阅读表明
=default根本不是问题。除非使用,否则不应实例化。 -
哦..又是一年中的那个时候,当您开始发布有趣的问题时? :D
-
它似乎还没有被引用:[dcl.fct.def.default]/1.2 说明了为什么
pair的默认复制 ctor 是非法的 - 我将其解释为 它的声明格式不正确,因此不需要实例化来使程序格式错误。
标签: c++ c++11 stl c++-standard-library