对end()解引用安全吗?

Is it safe to dereference end()?

本文关键字:安全 引用 end      更新时间:2023-10-16

我有一个签名如下的函数:

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;
}

和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());
}
然而,这可能是不安全的(解引用s.end()本身可能是红牌违规)。是否有一种安全的方法来获得一个指向字符开始的指针和一个经过一次结束的指针(在空字符串的情况下,两个空指针就可以了),还是必须写
std::string(const std::string& s) {
    return s.empty() ? std::string() : f(& s.front(), & s.front() + s.size());
}

取消对end()的引用是不安全的。然而,您可以使用c_str()data()来实现您所需要的:

std::string(const std::string& s) {
    return f(s.data(), s.data() + s.size());
}