我偶然发现了新std::pair
构造函数的一个令人惊讶的行为,这是C++ 11引入的.我在使用时观察到了这个问题std::pair
,并且它发生了,因为std::atomic
它既不可复制也不可移动.在下面的代码,我取代std::atomic
用foobar
了简化.
下面的代码编译很好,包括GCC-4.9和Clang-3.5(有和没有libc ++):
struct foobar { foobar(int) { } // implicit conversion // foobar(const foobar&) = delete; }; std::pairp{1, 2};
此行为是预期的.但是,当我删除复制构造函数时foobar
,编译失败.它适用于分段构造,但我认为这不应该是必要的,因为隐式转换int
为foobar
.我指的是具有以下签名的构造函数:
templatepair(U&& u, V&& v);
你能解释为什么对构造函数是如此限制,并且不允许对noncopyable/nonmovable类型进行隐式转换?