gpt4 book ai didi

c++ - 具有显式构造函数的类是否需要 piecewise_construct in emplace?

转载 作者:行者123 更新时间:2023-11-27 23:58:06 25 4
gpt4 key购买 nike

如果我创建一个带有 explicit 的结构构造函数

struct A {
int x;
explicit A(int x):x(x){};
};

然后将其用作 mapped_typestd::map ,我可以用分段构造函数来放置:

#include <map>
std::map<int, A> foo;

foo.emplace(
std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(10)
);

但是当我尝试使用移动或模板构造函数时,我遇到错误并且无法编译:

foo.emplace(std::make_pair(2, 20)); // <-- doesn't work
foo.emplace(3, 30); // <-- doesn't work

这是怎么回事?直到现在,我还没有意识到这些不同用法之间存在很大差异。我想,使用 pair move 构造函数,从 std::pair<int, A> 进行隐式转换可能是有意义的...但是为什么必须在模板构造函数中发生这种情况?然后为什么使用分段构造函数??

我查了一下,但是 std::map::emplace 的文档和 explicit不要真的为我澄清这一点。

最佳答案

之前N4387 , pair<T1, T2>的构造函数采用 U/V do not exist除非U可隐式转换为 T1V可隐式转换为 T2 :

template<class U, class V> constexpr pair(U&& x, V&& y);

Requires: is_constructible<first_type, U&&>::value is true and is_constructible<second_type, V&&>::value is true.

Effects: The constructor initializes first with std::forward<U>(x) and second with std::forward<V>(y).

Remarks: If U is not implicitly convertible to first_type or V is not implicitly convertible to second_type this constructor shall not participate in overload resolution.

同样适用于 const pair<U, V>&pair<U, V>&&构造函数。

由于这些构造函数实际上不存在,所以您后面的两个 emplace s 将不起作用。


N4387 更改了此处的规则,因此这些构造函数变为 explicit如果两种类型都可以从相应的参数类型构造,但至少有一种类型不能从参数类型隐式转换。因此,在 C++17 中,所有三个 emplace s 将编译。另外,作为论文addresses a defect report raising pretty much this exact issue (在几个中),实现也可以选择在早期的标准模式中实现它。

关于c++ - 具有显式构造函数的类是否需要 piecewise_construct in emplace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41092181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com