取消引用end()是否安全?

Bul*_*net 2 c++ stl

我有一个具有以下签名的函数:

std::string f(const char *first, const char *last) {
    std::string result;
    std::for_each(first, last, some_lambda_which_appends_to_result);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

以及调用它的std :: string的重载:

std::string f(const std::string s) {
    return f(&*s.begin(), &*s.end());
    // The one below would assume that the string is not empty
    //     f(& s.front(), & s.front() + s.size());
}
Run Code Online (Sandbox Code Playgroud)

但是,这可能是不安全的(取消引用s.end()本身可能是一张红牌攻击).是否有一种安全的方法来获取指向字符开头的指针和一个一个接一个的结束指针(如果是空字符串,两个空指针就可以了),或者我是否必须写

std::string(const std::string& s) {
    return s.empty() ? std::string() : f(& s.front(), & s.front() + s.size());
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

解除引用是不安全的end().但是,您可以使用c_str()data()达到你需要的东西:

std::string(const std::string& s) {
    return f(s.data(), s.data() + s.size());
}
Run Code Online (Sandbox Code Playgroud)