const_string 库问题
Posted
技术标签:
【中文标题】const_string 库问题【英文标题】:const_string lib issue 【发布时间】:2011-09-02 09:10:40 【问题描述】:我正在尝试const_string lib,它看起来不错,但它在运行时因访问冲突而崩溃(atomic_count,operator++())。测试代码:
#include <boost/const_string/const_string.hpp>
#include <boost/const_string/concatenation.hpp>
typedef boost::const_string<wchar_t> wcstring;
class Test
private:
const wcstring &s1;
const wcstring &s2;
public:
Test()
: s1(L"")
, s2(L"")
const wcstring &GetS1()
return s1;
const wcstring &GetS2()
return s2;
;
Test t;
int _tmain(int argc, _TCHAR* argv[])
//Test t;
wcstring t1 = t.GetS1(); // crashes here
wcstring t2 = t.GetS2();
return 0;
只有当 t 是全局的时它才会崩溃。如果我将声明移到 main() 中,就可以了。 系统:VS 2010,boost v. 1.47.0
问题:我做错了什么还是库/编译器的问题? 有人可以推荐一个更稳定的 C++ 不可变字符串实现吗?
【问题讨论】:
【参考方案1】:您的Test
实例已将其reference 数据成员初始化为对从文字L""
创建的临时对象的引用。
哎呀。当您尝试在崩溃行的 wcstring
的复制构造函数中使用其中一个时,这些临时对象不再存在,因此您的引用不会引用任何内容。
我认为boost::const_string
应该几乎总是按价值使用,这就是它的用途。
【讨论】:
我不得不承认对此一无所知 -const
ref 可以绑定到一个临时对象,从而延长其在当前范围内的生命周期。这里的范围是什么?构造函数?如果是这种情况,const
ref 将表现得像一个普通的引用。都有些什么样的规矩? (这值得提出一个新问题吗?)
@Konrad:是的,它是构造函数的主体。 12.2/5,“临时绑定到构造函数的 ctor-initializer (12.6.2) 中的引用成员,直到构造函数退出”。这确实使 const 引用数据成员有点危险,我不能随便想到 any 的情况,在这种情况下,您想要一个在构造函数中使用但没有其他地方的数据成员,所以不小心用临时的几乎可以保证在未定义的稍后日期会发生一些不好的事情。
谢谢史蒂夫,我现在看到了问题。
太糟糕了,这个特定的 const_string
构造函数不明确。
@dalle:也许吧。它会阻止人们在引用值时意外使用引用,但很可能还有其他需要隐式转换的用途。如果一个函数采用std::string
,那么能够使用字符串文字而不是不强制转换来调用它是很有用的,虽然我没有使用const_string
,但我假设在那里也是如此。当然,如果它是显式的,那么人们总是可以为这些函数编写重载。我想这取决于你是否喜欢弱类型 - 如果不喜欢,那么你不希望任何东西都有非显式的 ctors。以上是关于const_string 库问题的主要内容,如果未能解决你的问题,请参考以下文章