我正在考虑使用boost :: serialization并尝试使用http://www.ocoudert.com上提供的字符串帮助器,其中包含接口
SerializeCStringHelper(char*& s) : s_(s) {}
SerializeCStringHelper(const char*& s) : s_(const_cast<char*&>(s)) {}
我尝试在下面的代码中使用这个帮助器(getName()返回一个std :: string)
bool MyUtilities::saveSerialLibraryToFile(const string& fileName, const MyLibrary& lib)
{
bool saved = false;
ofstream out(fileName, ios::app);
if(out.is_open())
{
boost::archive::text_oarchive ar(out);
const char* str = lib.getName().c_str();
SerializeCStringHelper helper(str);
// SerializeCStringHelper helper(lib.getName().c_str());
ar & helper;
saved=true;
}
return saved;
}
编译很好,但现在如果我用注释掉的代码替换const char * str和helper行,我得到编译错误C2664:无法将参数1从'const char *'转换为'char *&amp;'< / p>
我的问题是,为什么单行不同于两条不同的行?
答案 0 :(得分:2)
SerializeCStringHelper helper(lib.getName().c_str());
此行尝试将临时文件传递给SerializeCStringHelper
的构造函数,问题是您无法将临时文件绑定到非const引用。这就是SerializeCStringHelper helper(str);
有效的原因,因为str
不是临时对象。
示例:
#include <string>
void foo(const char*& str) {}
void bar(const char* const & str) {}
int main()
{
std::string s("...");
//foo(s.c_str());
bar(s.c_str());
return 0;
}
这段代码编译得很好,因为bar需要一个const引用,但如果取消对foo的调用,它将无法编译,因为foo采用非const引用。