作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Cppreference 为 std::forward_as_tuple
下面的例子(见 here)
#include <iostream>
#include <map>
#include <tuple>
#include <string>
int main()
{
std::map<int, std::string> m;
m.emplace(std::piecewise_construct,
std::forward_as_tuple(10),
std::forward_as_tuple(20, 'a'));
std::cout << "m[10] = " << m[10] << '\n';
// The following is an error: it produces a
// std::tuple<int&&, char&&> holding two dangling references.
//
// auto t = std::forward_as_tuple(20, 'a');
// m.emplace(std::piecewise_construct, std::forward_as_tuple(10), t);
}
m.emplace(std::make_pair(20,std::string(20,'a')));
最佳答案
它避免制作不必要的或可能不可能的对象拷贝。
首先,让我们考虑除 std::string
以外的值类型.我将使用无法复制的东西,但这也适用于可以复制但这样做很昂贵的东西:
struct NonCopyable
{
NonCopyable(int a, char b) {} // Dummy
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
};
std::map<int, NonCopyable> m
?让我们来看看可能性:
m.insert({10, NonCopyable{10, 'a'}});
std::pair
的引用并复制它,这需要复制
NonCopyable
对象,这是不可能的。
m.emplace(10, NonCopyable{10, 'a'}});
std::pair
值到位,它仍然要复制
NonCopyable
目的。
m.emplace(std::piecewise_construct,
std::tuple{10},
std::tuple{10, 'a'});
std::pair
element 是就地构造的,它的两个子对象也是如此。
struct UsesNonCopyable
{
UsesNonCopyable(const NonCopyable&) {}
UsesNonCopyable(const UsesNonCopyable&) = delete;
UsesNonCopyable& operator=(const UsesNonCopyable&) = delete;
};
std::map<int, UsesNonCopyable> m
添加元素?
m.emplace(std::piecewise_construct,
std::tuple{10},
std::tuple{NonCopyable{10, 'a'}});
NonCopyable
对象必须复制到
std::tuple
传递给
std::pair
的对象的构造函数。
std::forward_as_tuple
进来:
m.emplace(std::piecewise_construct,
std::tuple{10},
std::forward_as_tuple(NonCopyable{10, 'a'}));
m.emplace
包含
NonCopyable
拷贝的元组对象,我们使用
std::forward_as_tuple
构造一个包含对
NonCopyable
的引用的元组目的。该引用被转发到
std::pair
的构造函数,它将依次转发给
UsesNonCopyable
的构造函数。
std::map::try_emplace
消除了大部分这种复杂性。只要您的 key 类型是可复制的。以下
will work很好,而且要简单得多:
std::map<int, UsesNonCopyable> m;
m.try_emplace(10, NonCopyable{10, 'a'});
关于c++ - std::forward_as__tuple 的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61115338/
Cppreference 为 std::forward_as_tuple下面的例子(见 here) #include #include #include #include int main()
我是一名优秀的程序员,十分优秀!