簡體   English   中英

boost :: lexical_cast與boost :: filesystem的奇怪異常

[英]Strange exception from boost::lexical_cast with boost::filesystem

在RHEL7.4上,提升1.53,

#include <iostream>
#include <boost/filesystem.hpp>
#include <boost/lexical_cast.hpp>

using namespace std;
using namespace boost;

int main() {
    const string& s1 = "1024";
    cout << "test1:" << lexical_cast<unsigned int>(s1) << endl;

    filesystem::path p("1024");
    cout << "test2:" << lexical_cast<unsigned int>(p.filename().string()) << endl;

    const string& s2 = p.filename().string();
    cout << "test3:" << lexical_cast<unsigned int>(s2) << endl;

    return 0;
}

此代碼給出:

test1:1024
test2:1024
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >'
  what():  bad lexical cast: source type value could not be interpreted as target
zsh: abort      ./a.out

也許這是一個lexical_cast的bug,但有人知道為什么test3會失敗? 特別是,我無法理解test1和3之間的不同。

這一行創建了一個懸空參考:

const string& s2 = p.filename().string();

那是因為在POSIX系統上, path::filename()返回對成員的引用 (!!!)。 因此,不會發生生命周期延長,就像它已經返回一個臨時的一樣。

現在,因為filename()返回一個臨時path() ,引用不再有效。 您的程序調用未定義的行為。

我建議修復如下:

p = p.filename();
const string& s2 = p.string();
cout << "test3:" << lexical_cast<unsigned int>(s2) << endl;

要么

p = p.filename();
cout << "test3:" << lexical_cast<unsigned int>(p.string()) << endl;

甚至

cout << "test3:" << lexical_cast<unsigned int>(p.filename().string()) << endl;

最重要的是保持簡單:

std::string const s2 = p.filename().string();
cout << "test3:" << lexical_cast<unsigned int>(s2) << endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM