
On 2 November 2011 12:54, Olaf van der Spek <ml@vdspek.org> wrote:
assert(s == s.c_str()); assert(std::string(p) == p); assert(std::string(l, sizeof(l) - 1) == l);
For what values does this fail?
assert(s == s.c_str()); fails when s contains an embedded 0. assert(std::string(p) == p); invokes undefined behavior when p is 0 or p points to something that isn't 0-terminated. assert(std::string(l, sizeof(l) - 1) == l) fails when l contains an embedded 0.
Isn't the operator== with std::string and const char* well defined?
It is well defined given the precondition that p points to something that is 0-terminated. However, that precondition alone is not sufficient to make it an equivalence relation. In these case the equivalence relation is not a property of the types but of the values they represent, no matter how much handwaving goes on around here about how those cases aren't important. They can be a property of the types involved, but they just aren't in this circumstance, as const char* can mean too many different things. -- Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404