【问题标题】:C++: Get LPCWSTR from wstringstream?C++:从 wstringstream 获取 LPCWSTR?
【发布时间】:2010-06-07 17:32:34
【问题描述】:

如果我有一个wstringstream,并且我想将其.str() 数据作为 LPCWSTR,我该怎么做?

【问题讨论】:

    标签: c++ string unicode


    【解决方案1】:

    你可以做wstringstream.str().c_str()as DeadMG writes。但是,该调用的结果仅在表达式的生命周期结束之前有效,这是其中的一部分。

    具体来说,这个

    const LPCWSTR p = wss.str().c_str();
    f(p); // kaboom!
    

    将不起作用,因为wstringstream.str() 返回一个临时对象,.c_str() 返回指向该对象的指针,并且在分配结束时该临时对象将被破坏。

    你可以做的不是

    f(wss.str().c_str()); // fine if f() doesn't try to keep the pointer
    

    const std::wstring& wstr = wss.str(); // extends lifetime of temporary 
    const LPCWSTR p = wstr.c_str();
    f(p); // fine, too
    

    因为绑定到const 引用的临时对象的生命周期将延长到引用的生命周期。

    【讨论】:

    • 或者,如果分配给常量引用,则引用的生命周期
    • @Greg:我刚刚在写这个。 :)
    • 我认为您的第二个代码不好,因为 C++ 可以在调用 f 之前销毁临时代码。这真的发生在我身上一次!所以绝对不能存储c_str()data() 的结果。
    • @Philipp:在完整表达式的评估结束之前销毁临时文件是不合法的,因此如果您遇到这种情况,您一定是使用了有问题的编译器。
    • 我们只创建一个简单的 wstring 对象怎么样?它也会失效吗?即使我们使用复制构造函数(或初始化时的赋值)作为wstring s(wstr.str()); f(s.c_str()); 有什么区别?特别是范围/寿命延长的东西?谢谢。
    【解决方案2】:

    wstringstream.str().c_str();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-08
      • 2014-05-27
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多