<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 21/10/2025 19:08, Even Rouault
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:bea7bfab-a361-4a04-9758-a8bf9c5e0440@spatialys.com">
      <br>
      <blockquote type="cite">Encapsulating the object into a wrapper
        when returning the object to a language with automatic GC.
        <br>
        <br>
        If I don't do this, I will have to keep a reference to the layer
        or the feature. Or clone it.
        <br>
      </blockquote>
      <br>
      I see different options:
      <br>
      <br>
      1) we revert that change. Downside: users may believe that they
      can modify the OGRFeatureDefn* instance, which can potentially
      cause crashes if they are OGRFeature* based on it (that was the
      rationale for const'ifying)
      <br>
      <br>
      2) we make OGRFeatureDefn::Reference() and Dereference() const
      methods. But that's a clear violation of const semantics, given
      that we have a GetRefCount() and thus the observable state is
      modified, so not something I'd be super keen doing
      <br>
      <br>
      3) the caller of OGRFeature::GetDefnRef() takes responsibility for
      const_cast'ing the const pointer to a non-const pointer. For the
      purpose of just modifying the ref counter, that's fine. <br>
    </blockquote>
    <p>Just checked and it seems that a plain (non-ref) const shared_ptr
      can be copied:</p>
    <div
style="color: #cccccc;background-color: #1f1f1f;font-family: Cascadia Code, Menlo, Monaco, 'Courier New', monospace, Menlo, Monaco, 'Courier New', monospace;font-weight: normal;font-size: 12px;line-height: 18px;white-space: pre;"><div><span
    style="color: #c586c0;">#include</span><span style="color: #569cd6;"> </span><span
    style="color: #ce9178;"><memory></span></div><div><span
    style="color: #c586c0;">#include</span><span style="color: #569cd6;"> </span><span
    style="color: #ce9178;"><string></span></div>
<div><span style="color: #c586c0;">using</span><span
    style="color: #cccccc;"> </span><span style="color: #569cd6;">namespace</span><span
    style="color: #cccccc;"> </span><span style="color: #4ec9b0;">std</span><span
    style="color: #cccccc;">;</span></div>
<div><span style="color: #569cd6;">int</span><span
    style="color: #cccccc;"> </span><span style="color: #dcdcaa;">fn1</span><span
    style="color: #cccccc;">(</span><span style="color: #569cd6;">const</span><span
    style="color: #cccccc;"> </span><span style="color: #4ec9b0;">shared_ptr</span><span
    style="color: #cccccc;"><</span><span style="color: #4ec9b0;">string</span><span
    style="color: #cccccc;">> </span><span style="color: #9cdcfe;">s</span><span
    style="color: #cccccc;">) {</span></div><div><span
    style="color: #cccccc;">  </span><span style="color: #c586c0;">return</span><span
    style="color: #cccccc;"> </span><span style="color: #b5cea8;">0</span><span
    style="color: #cccccc;">;</span></div><div><span
    style="color: #cccccc;">}</span></div>
<div><span style="color: #569cd6;">int</span><span
    style="color: #cccccc;"> </span><span style="color: #dcdcaa;">fn2</span><span
    style="color: #cccccc;">(</span><span style="color: #569cd6;">const</span><span
    style="color: #cccccc;"> </span><span style="color: #4ec9b0;">shared_ptr</span><span
    style="color: #cccccc;"><</span><span style="color: #4ec9b0;">string</span><span
    style="color: #cccccc;">> </span><span style="color: #9cdcfe;">s</span><span
    style="color: #cccccc;">) {</span></div><div><span
    style="color: #cccccc;">  </span><span style="color: #c586c0;">return</span><span
    style="color: #cccccc;"> </span><span style="color: #dcdcaa;">fn1</span><span
    style="color: #cccccc;">(</span><span style="color: #9cdcfe;">s</span><span
    style="color: #cccccc;">);</span></div><div><span
    style="color: #cccccc;">}</span></div>
<div><span style="color: #569cd6;">int</span><span
    style="color: #cccccc;"> </span><span style="color: #dcdcaa;">main</span><span
    style="color: #cccccc;">() {</span></div><div><span
    style="color: #cccccc;">  </span><span style="color: #569cd6;">const</span><span
    style="color: #cccccc;"> </span><span style="color: #4ec9b0;">shared_ptr</span><span
    style="color: #d4d4d4;"><</span><span style="color: #4ec9b0;">string</span><span
    style="color: #d4d4d4;">></span><span style="color: #cccccc;"> </span><span
    style="color: #9cdcfe;">s</span><span style="color: #cccccc;"> </span><span
    style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
    style="color: #dcdcaa;">make_shared</span><span
    style="color: #cccccc;"><</span><span style="color: #4ec9b0;">string</span><span
    style="color: #cccccc;">>(</span><span style="color: #ce9178;">"s"</span><span
    style="color: #cccccc;">);</span></div><div><span
    style="color: #cccccc;">  </span><span style="color: #569cd6;">const</span><span
    style="color: #cccccc;"> </span><span style="color: #4ec9b0;">shared_ptr</span><span
    style="color: #d4d4d4;"><</span><span style="color: #4ec9b0;">string</span><span
    style="color: #d4d4d4;">></span><span style="color: #cccccc;"> </span><span
    style="color: #9cdcfe;">s2</span><span style="color: #cccccc;"> </span><span
    style="color: #d4d4d4;">=</span><span style="color: #cccccc;"> </span><span
    style="color: #9cdcfe;">s</span><span style="color: #cccccc;">;</span></div><div><span
    style="color: #cccccc;">  </span><span style="color: #dcdcaa;">fn2</span><span
    style="color: #cccccc;">(</span><span style="color: #9cdcfe;">s</span><span
    style="color: #cccccc;">);</span></div><div><span
    style="color: #cccccc;">  </span><span style="color: #c586c0;">return</span><span
    style="color: #cccccc;"> </span><span style="color: #b5cea8;">0</span><span
    style="color: #cccccc;">;</span></div><div><span
    style="color: #cccccc;">}</span></div></div>
    <p>This is valid even for C++98 without copy ellision.</p>
    <pre class="moz-signature" cols="72">-- 
Momtchil Momtchev <a class="moz-txt-link-rfc2396E" href="mailto:momtchil@momtchev.com"><momtchil@momtchev.com></a></pre>
  </body>
</html>