【问题标题】:boost make_shared takes in a const reference. Any way to get around this?boost make_shared 接受一个 const 引用。有什么办法可以解决这个问题?
【发布时间】:2010-11-25 07:47:57
【问题描述】:

我在我的程序中使用 boost 共享指针,并且我有一个类,它以对另一个对象的引用作为参数。我遇到的问题是 make_shared 函数要求所有参数都是 const 引用,如果我的类的构造函数不允许传入 const 引用参数,则会出现编译错误。

有人知道这背后的原因吗?另外,有什么办法可以解决这个问题吗?

给我带来问题的代码示例:

class Object
{
  public:
    Object(int& i)
    {
      i = 2;
    }
};


int main(int argc, char *argv[])
{
  int i = 0;
  boost::shared_ptr<Object> obj = boost::make_shared<Object>(i);
  return 1;
}

这会导致编译器错误,指出以下内容

:make_shared.hpp:185: 错误:没有匹配的函数调用 `Object::Object(const int&)' 注意:候选对象是:Object::Object(const Object&) 注意:Object::Object(int&)

如果 Objects 构造函数的参数是 const int,则此方法有效。我很好奇为什么 make_shared 会有这种行为。

【问题讨论】:

  • 你能给我们看一些代码来演示你想如何使用make_shared()吗?

标签: c++ boost


【解决方案1】:

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html 说:“如果您需要将非常量引用传递给 T 的构造函数,您可以通过将参数包装在对 boost::ref 的调用中来实现。”该页面上的其他文字似乎支持 Rüdiger Hanke 的回答。

【讨论】:

  • 太棒了,谢谢我真的不想使用下面的解决方法。
【解决方案2】:

不能代表他的功能的作者,但是......你必须做出选择。如果函数将使用非 const 引用,那么您不能将 const 对象传递给采用 const 引用的构造函数。

根据我的经验,采用 const 引用的构造函数比采用可变引用的构造函数更常见。

构造函数可以具有n 参数,因此您不能只提供单个重载,而是必须考虑任何 const/non-const 组合,这会导致您需要的重载呈指数爆炸式增长想要为所有这些提供重载。我认为 C++0x 和完美转发应该可以解决这个问题。

【讨论】:

  • 完美的解释。谢谢。
【解决方案3】:

rvalue references(参见标题为“转发问题”的部分)到达 C++0x 之前,完美的转发几乎是不可能的。 make_shared 尽其所能。

【讨论】:

  • +1 有人实际上发布了解释为什么会这样,而不仅仅是使用 boost::ref(..) :)
  • 链接已损坏。
  • @Hugo 谢谢,已修复,尽管我认为每个编译器在过去十年中都添加了右值引用。 :)
【解决方案4】:

你需要定义一个拷贝构造函数。

class Object
{
  public:
    Object(const Object& original)
    {
        // Copy original to new object
        // The reason for the const is this should not change the original 
    };

    Object(int& i)
    {
      i = 2;
    }
};

【讨论】:

    【解决方案5】:

    虽然我仍然不知道为什么 boost make_shared 会对我施加这个限制,但我已经找到了解决它的方法。如果我传入对参数指针的 const 引用,则可以更改指针。这是代码sn-p:

    class Object
    {
      public:
        Object(int* const& i)
        {
          *i = 2;
        }
    };
    
    
    int main(int argc, char *argv[])
    {
      int i = 0;
      boost::shared_ptr<Object> obj = boost::make_shared<Object>(&i);
      cout << i << "\n";
      return 1;
    }
    

    这个就像一个魅力。任何人都知道为什么我需要跳过这些箍? make_shared 将这个限制强加给我似乎很奇怪,尽管我同意大多数时候这可能是一个坏主意。

    【讨论】:

      【解决方案6】:

      您也许可以通过使 Object 构造函数 explicit 来修复它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-17
        • 2020-12-29
        • 2012-03-28
        • 2021-03-07
        • 1970-01-01
        • 2016-01-19
        • 2022-09-27
        • 2011-02-26
        相关资源
        最近更新 更多