升压make_shared发生在一个常量引用。 任何方式来解决这个问题?(boost make_

2019-07-04 15:17发布

我用我的计划提振共享指针,和我有一个类,它作为一个参数对另一个对象的引用。 我遇到的问题是make_shared功能要求所有的参数是一个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:错误:调用`对象:对象(const int的&)”注意没有匹配功能:候选人是:对象:对象(const对象和)注:对象:对象(INT和)

如果参数对象的构造是用const int,这个工程。 我很好奇,为什么make_shared行为这种方式。

Answer 1:

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html说:“如果你需要一个非const引用传递给T的构造函数,你可以通过包装参数这么做在通话中,以提高:: REF“。 该网页上的其他文字似乎支持吕迪格汉克的答案。



Answer 2:

不能因为他的功能的作者说,但是......你必须做出选择。 如果函数将使用非const引用,那么你可以不通过const对象到采取常量引用的构造函数。

根据我的经验,建设者采取常量引用是不是采取可变引用构造更为常见。

构造函数可以有n参数,所以你不能只是提供单一的过载,但必须考虑到你需要的,如果你想提供常量/非const导致过载的指数爆炸的任意组合重载所有的人。 的C ++ 0x和完善的转发应提供针对此问题,我认为一个解决方案。



Answer 3:

直到右值引用 (参见“转发问题”一节)中的C ++ 0x抵达,完美转发是不可能的。 make_shared只是做最好的它可以用它给了。



Answer 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;
    }
};


Answer 5:

虽然我仍然不知道为什么升压make_shared强加给我这个限制,我已经找到办法解决它。 如果我在一个常量引用传递给所述参数的指针,然后我可以改变指针。 以下是代码片段:

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强加给我这个限制,即使我同意它可能是一个坏主意的大部分时间似乎很奇怪。



Answer 6:

您可能能够通过将对象的构造函数来解决它明确 。



文章来源: boost make_shared takes in a const reference. Any way to get around this?
标签: c++ boost