我用我的计划提振共享指针,和我有一个类,它作为一个参数对另一个对象的引用。 我遇到的问题是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行为这种方式。
http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html说:“如果你需要一个非const引用传递给T的构造函数,你可以通过包装参数这么做在通话中,以提高:: REF“。 该网页上的其他文字似乎支持吕迪格汉克的答案。
不能因为他的功能的作者说,但是......你必须做出选择。 如果函数将使用非const引用,那么你可以不通过const对象到采取常量引用的构造函数。
根据我的经验,建设者采取常量引用是不是采取可变引用构造更为常见。
构造函数可以有n
参数,所以你不能只是提供单一的过载,但必须考虑到你需要的,如果你想提供常量/非const导致过载的指数爆炸的任意组合重载所有的人。 的C ++ 0x和完善的转发应提供针对此问题,我认为一个解决方案。
直到右值引用 (参见“转发问题”一节)中的C ++ 0x抵达,完美转发是不可能的。 make_shared
只是做最好的它可以用它给了。
您需要定义一个拷贝构造函数。
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;
}
};
虽然我仍然不知道为什么升压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强加给我这个限制,即使我同意它可能是一个坏主意的大部分时间似乎很奇怪。
文章来源: boost make_shared takes in a const reference. Any way to get around this?