我在我的程序中使用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;
}
Run Code Online (Sandbox Code Playgroud)
这会导致编译器错误,指出以下内容
:make_shared.hpp:185:错误:没有匹配函数来调用`Object :: Object(const int&)'注意:候选者是:Object :: Object(const Object&)注意:Object :: Object(int&)
如果Objects构造函数的参数是const int,则可以使用.我很好奇为什么make_shared会这样做.
Jit*_*sen 42
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和完美转发应该为我认为的这个问题提供解决方案.