共享需要一个const引用。 任何方式来解决这个问题?
我在我的程序中使用boost共享指针,并且我有一个类作为参数引用另一个对象。 我碰到的问题是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:错误:没有匹配的函数调用Object :: Object(const int&)'注:候选人是:Object :: Object(const Object&)note:Object :: Object(int&
如果对象构造函数的参数是一个const int,则可以使用。 我很好奇为什么make_shared的行为如此。
http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/make_shared.html说:“如果你需要传递一个非const引用给T的构造函数,你可以通过包装参数来实现在对boost :: ref的调用中“。 该页面上的其他文字似乎支持RüdigerHanke的回答。
不能为他的功能作者说话,但是......你必须做出选择。 如果该函数使用非const引用,那么您无法将const对象传递给采用const引用的构造函数。
根据我的经验,使用const引用的构造函数比使用可变引用的构造函数要普遍得多。
构造函数可以有n
参数,所以你不能只提供一个单独的重载,但必须考虑const / non-const的任何组合,这会导致如果你想要提供的重载的指数爆炸它们都是超载的。 C ++ 0x和完美的转发应该为我认为的这个问题提供一个解决方案。
直到右值引用(请参阅标题为“转发问题”的部分)以C ++ 0x到达时,完美转发几乎不可能。 make_shared
只是尽其所能地做到最好。
上一篇: shared takes in a const reference. Any way to get around this?
下一篇: Why is #include <string> preventing a stack overflow error here?