- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我创建一个带有 explicit
的结构构造函数
struct A {
int x;
explicit A(int x):x(x){};
};
然后将其用作 mapped_type
在std::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
可隐式转换为 T1
和 V
可隐式转换为 T2
:
template<class U, class V> constexpr pair(U&& x, V&& y);
Requires:
is_constructible<first_type, U&&>::value
istrue
andis_constructible<second_type, V&&>::value
istrue
.Effects: The constructor initializes
first
withstd::forward<U>(x)
andsecond
withstd::forward<V>(y)
.Remarks: If
U
is not implicitly convertible tofirst_type
orV
is not implicitly convertible tosecond_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/
如果我创建一个带有 explicit 的结构构造函数 struct A { int x; explicit A(int x):x(x){}; }; 然后将其用作 mapped_type
当与 std::map 一起使用时,我对 std::piecewise_construct 有点困惑。示例: std::map m; // uses pair's piecewise construc
std::piecewise_construct,在 中定义,具有内部链接,因为它被声明为 constexpr。我想知道在 header 中使用 std::piecewise_construct 是否
我有一个 unordered_map哪些商店对。我想用这个片段放置对: map.emplace(std::piecewise_construct, std::f
我是一名优秀的程序员,十分优秀!