<!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>