小编Sen*_*ent的帖子

boost :: noncopyable的unordered_map无法从operator []返回引用

为了演示我的问题,请考虑这个不编译的简单程序:

#include <boost/noncopyable.hpp>
#include <unordered_map>

class foo : boost::noncopyable { };

int main()
{
    std::unordered_map<int, foo> m;
    auto & element = m[0];

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用当前版本的boost(1.52),Visual Studio 2012返回错误: cannot access private member declared in class 'boost::noncopyable_::noncopyable.

std :: unordered_map的operator []返回对所提供键的元素的引用,乍一看似乎应该有效 - 我已经要求引用元素,而不是它的副本.

我对这个问题的理解是这个(这可能是错的,因为我有一段时间没有使用过C++).如果未找到该键,则unordered_map将创建一个新元素并返回对该新元素的引用.boost :: noncopyable定义(私有)复制构造函数,但不定义移动构造函数,因此编译器不会生成移动构造函数.在其operator []中,std :: unordered_map使用std :: move,但由于boost :: noncopyable没有定义移动构造函数,因此它会回退到复制构造函数.由于复制构造函数是私有的,因此编译失败.

是什么促使这篇文章是我正在尝试创建一个boost :: signal2 :: signal的unordered_map,它继承自boost :: noncopyable.如果没有黑客攻击库,我可以做一个简单的解决方法吗?将信号包装在unique_ptr中是一种选择,但在我看来,我可能在这里做错了.

更新:

我可能发布得太快了!似乎无法将boost :: noncopyable的子类添加到unordered_map.Insert,operator []和emplace都使用复制构造函数(私有)或移动操作(对于boost :: noncopyable不存在).对我来说这似乎是一个主要的限制.甚至可以创建一个包含boost :: noncopyable对象的unordered_map吗?我明确没有尝试复制它们 - 我希望它们将整个生命周期都花在unordered_map中.

c++ boost

8
推荐指数
1
解决办法
1577
查看次数

使用相同参数初始化元组

我似乎无法解决这个问题。有没有办法初始化每个元素采用相同参数的元组?例如...

template <class... args>
std::tuple<args...> tuplemaker(int n)
{
    // What goes here?
}

auto my_tuple = tuplemaker<int, int, int>(42);
Run Code Online (Sandbox Code Playgroud)

可以肯定的是,这是一个人为的例子。我真正想做的是将相同的参数重复传递给元组元素的构造函数。有人有建议吗?

c++ c++11

2
推荐指数
1
解决办法
401
查看次数

标签 统计

c++ ×2

boost ×1

c++11 ×1