Ist es in Ordnung, „&*string.end()“ zu schreiben?C++

Programme in C++. Entwicklerforum
Anonymous
 Ist es in Ordnung, „&*string.end()“ zu schreiben?

Post by Anonymous »

Ich sehe viele Stellen in öffentlichen Repositories, an denen der erste und der letzte Iterator von std::vector/

Code: Select all

std::string
/

Code: Select all

std::string_view
werden mithilfe der Kombination von &*-Operatoren in Zeiger umgewandelt. Insbesondere wird es häufig zum Aufrufen von std::from_chars verwendet, z. B.

Code: Select all

auto const parse_int = [](std::string_view sv, int base = 10) -> int {
int value;
auto result = std::from_chars(&*sv.begin(), &*sv.end(), value, base);
...
Ist es tatsächlich sicher und kein undefiniertes Verhalten, end() (das auf das Element nach dem letzten Element im Container/Ansicht zeigt) mit * zu dereferenzieren, bevor es mit & zurück in den Zeiger konvertiert wird?
Ich habe versucht, einen ähnlichen Code mit &* in einem konstanten Ausdruck auszuwerten, bei dem undefiniertes Verhalten vom Compiler erkannt werden muss:

Code: Select all

static_assert( [] {
const char s[3] = { 'e', 'n', 'd' };
[[maybe_unused]] auto * a = &*(s+3); // ok?
[[maybe_unused]] auto & b =  *(s+3); // ok?
return true;
}() );
Aber eigentlich sind alle Compiler damit einverstanden und beschweren sich nicht, Online-Demo.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post