首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用聚合初始化时,是否有可能在地图中进行不复制的嵌入?

在使用聚合初始化时,是否有可能在地图中进行不复制的嵌入?
EN

Stack Overflow用户
提问于 2019-03-04 09:33:44
回答 2查看 604关注 0票数 1

有关如何在不复制映射值的情况下插入到stdmap中,请参见此答案。

std::地图嵌入没有复制值

从这个答案继续--假设我的Foo类型如下所示:

代码语言:javascript
复制
struct Foo {
  const int& intref_; 
  std::mutex mutex_;
}

然后使用聚合初始化进行初始化,如下所示

代码语言:javascript
复制
Foo{7}

代码语言:javascript
复制
Foo{7, std::mutex()}

是否有可能以某种方式将其放置在地图上?

代码语言:javascript
复制
std::map<size_t, Foo> mymap;

我知道我可以为Foo编写一个构造函数--但是它能用聚合初始化来完成吗?

链接到编译器资源管理器:

Fm4k1

相关c++参考文献:

座落

初始化

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-04 11:24:12

你可以用利用铸型间接构造

代码语言:javascript
复制
template<typename T>
struct tag { using type = T; };

template<typename F>
struct initializer
{
    F f;
    template<typename T>
    operator T() &&
    {
        return std::forward<F>(f)(tag<T>{});
    }
};

template<typename F>
initializer(F&&) -> initializer<F>;

template<typename... Args>
auto initpack(Args&&... args)
{
    return initializer{[&](auto t) {
        using Ret = typename decltype(t)::type;
        return Ret{std::forward<Args>(args)...};
    }};
}

并把它当作

代码语言:javascript
复制
struct Foo
{
  const int& intref_; 
  std::mutex mutex_;
};

void foo()
{
    int i = 42;
    std::map<int, Foo> m;
    m.emplace(std::piecewise_construct,
              std::forward_as_tuple(0),
              std::forward_as_tuple(initpack(i)));
}

注意,不能通过将临时的生存期绑定到非堆栈引用来延长其生存期。

票数 5
EN

Stack Overflow用户

发布于 2019-03-04 12:10:55

这并不是std::map::try_emplace的问题,也不是std::pair的问题。由于这个简单的声明将重现一个根源于同一问题的错误:

代码语言:javascript
复制
std::pair<const int, Foo> p(
    std::piecewise_construct,
    std::forward_as_tuple(0),
    std::forward_as_tuple(i)
);

这并不是std::pair本身的问题。作为n4462细节的抽象,它非常普遍。简单地说,这对c‘’tor(和许多库函数一样)的转发如下:

代码语言:javascript
复制
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)

因此没有大括号,因此没有聚合初始化,只有值初始化。您今天唯一的选择是定义一个实际的C‘’tor,或者使用类似于Passer By's 聪明的解决方案之类的东西。

在飞行中有一篇论文(p0960),目的是在未来的标准修订中解决这个问题,但只有时间才能说明它将如何发展。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54980297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档