1

我正在考虑使用 boost::serialization 并尝试使用http://www.ocudert.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: cannot convert parameter 1 from 'const char *' to 'char *&'

我的问题是,为什么单行不同于两条单独的行?

4

1 回答 1

2

SerializeCStringHelper helper(lib.getName().c_str());

此行尝试将临时对象传递给构造函数,SerializeCStringHelper问题是您不能将临时对象绑定到非常量引用。这就是为什么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 引用。

于 2013-07-21T15:23:26.697 回答