That is either very implementation or operating system dependent (so perhaps no fit for the standard library) or has to be defined in terms of C++.

 

Perhaps define a template<T>, which signifies that an object of type template<T> is

 - containing a T as sub-object

 - const and const_casting the const away is UB, mutable attributes are not allowed or cannot be modfiied without UB

 - constructed at compile-time, that is even stricter than constinit, never destructed

 

then the notion of read-only is inside the type system

 

 

Another option would be to ask about a memory pool or allocator.

 

 

With std::is_read_only_memory you would also have to check each byte of the object. I think there is no guarantee in C++ that an object is either fully in RO space or fully in RW space.

 

 

 

-----Ursprüngliche Nachricht-----
Von: Frederick Virchanza Gotham via Std-Proposals <std-proposals@lists.isocpp.org>
Gesendet: Mi 01.04.2026 13:49
Betreff: [std-proposals] std::is_read_only_memory
An: std-proposals <std-proposals@lists.isocpp.org>;
CC: Frederick Virchanza Gotham <cauldwell.thomas@gmail.com>;
 
On a microcontroller that has non-volatile Flash from 0x200 to 0x7FFF, and which has volatile SRAM from 0x8000 to 0x10000, the implementation would be simple:
 
constexpr bool is_read_only_memory( void const *const begin, void const *const end ) noexcept 
{
    return begin >= 0x200 && end < 0x8000;
}
 
For a desktop PC program, it would be a little more complicated, for instance on Linux I would expect this to return 'true' for pages of memory that contain the ".rodata" section in the ELF file. Of course "is_read_only_memory" should not be used in scenarios where you will be editing page permissions, or where you write to a microcontroller's Flash at runtime.
 
The purpose of this function would be to optimise initialisation and copying. For instance if we have a class similar to 'std::string', and if we copy it, there's actually no need to allocate memory and copy the buffer contents -- the new string object can simply refer to the original buffer.
 
Of course for a desktop PC program, there might have to be a setup routine that keeps track of read-only pages every time "dlopen" or "LoadLibrary" is invoked.
 
So the constructor of a string class might become something like:
 
string::string(char const *const p) noexcept
{
    if ( std::is_read_only_memory( p, p + strlen(p) + 1 ) )
    {
        this->addr = p;
    }
    else
    {
        this->addr = new char[ strlen(p) + 1 ];
        strcpy( this->addr, p );
    }
}
 
 
 
-- 
 Std-Proposals mailing list
 Std-Proposals@lists.isocpp.org
 https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals