<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Const correctness mit std::unique_ptr]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich habe gerade ein Problem mit const correctness und std::unique_ptr.</p>
<p>Hier mal mein Code:</p>
<pre><code>#include &lt;memory&gt;

struct Resource {};

class Widget {
public:
	Widget() : mResource(std::make_unique&lt;Resource&gt;()) {}
	void doStuff() {}
	const Resource&amp; getResource() const { return *mResource; }
private:
	std::unique_ptr&lt;Resource&gt; mResource;
};

void doSomething(const std::unique_ptr&lt;Widget&gt;&amp; widget) {
	auto res = widget-&gt;getResource();
	// mach was mit res

	widget-&gt;doStuff();	// soll eigentlich nicht gehen
}

void application() {

	auto widget = std::make_unique&lt;Widget&gt;();
	doSomething(widget);
}
</code></pre>
<p>Ich möchte, dass der Aufruf <em>widget-&gt;doStuff()</em> in Zeile 18 zu einer Fehlermeldung des Compilers führt, weil die Funktion <em>doSomething</em> nichts am Widget verändern soll.</p>
<p>Ich habe daher diese Funktionssignatur ausprobiert:</p>
<pre><code>void doSomething(const std::unique_ptr&lt;const Widget&gt;&amp; widget);
</code></pre>
<p>Das hat mir aber eine Fehlermeldung für Zeile 24 eingebracht:</p>
<p>VS2013 schrieb:</p>
<blockquote>
<p>1&gt;cppforum\source.cpp(24): error C2664: 'void doSomething(const std::unique_ptr&lt;const Widget,std::default_delete&lt;_Ty&gt;&gt; &amp;)' : cannot convert argument 1 from 'std::unique_ptr&lt;Widget,std::default_delete&lt;Widget&gt;&gt;' to 'const std::unique_ptr&lt;const Widget,std::default_delete&lt;_Ty&gt;&gt; &amp;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Ty=const Widget<br />
1&gt; ]<br />
1&gt; Reason: cannot convert from 'std::unique_ptr&lt;Widget,std::default_delete&lt;Widget&gt;&gt;' to 'const std::unique_ptr&lt;const Widget,std::default_delete&lt;_Ty&gt;&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Ty=const Widget<br />
1&gt; ]<br />
1&gt; No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called</p>
</blockquote>
<p>Der Compiler sieht keine Möglichkeit ein Widget-Objekt in ein const Widget-Objekt umzuwandeln.</p>
<p>Wie löse ich dieses Problem am besten?<br />
Überladen möchte ich die Funktion eigentlich nicht, damit der Anwender bereits an der Signatur erkennt, das sein Widget nicht geändert wird.<br />
Gibt es dafür eine best practice?</p>
<p>Vielen Dank und viele Grüße<br />
Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334494/const-correctness-mit-std-unique_ptr</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 13:37:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334494.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Sep 2015 13:32:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Const correctness mit std::unique_ptr on Thu, 17 Sep 2015 13:34:20 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich habe gerade ein Problem mit const correctness und std::unique_ptr.</p>
<p>Hier mal mein Code:</p>
<pre><code>#include &lt;memory&gt;

struct Resource {};

class Widget {
public:
	Widget() : mResource(std::make_unique&lt;Resource&gt;()) {}
	void doStuff() {}
	const Resource&amp; getResource() const { return *mResource; }
private:
	std::unique_ptr&lt;Resource&gt; mResource;
};

void doSomething(const std::unique_ptr&lt;Widget&gt;&amp; widget) {
	auto res = widget-&gt;getResource();
	// mach was mit res

	widget-&gt;doStuff();	// soll eigentlich nicht gehen
}

void application() {

	auto widget = std::make_unique&lt;Widget&gt;();
	doSomething(widget);
}
</code></pre>
<p>Ich möchte, dass der Aufruf <em>widget-&gt;doStuff()</em> in Zeile 18 zu einer Fehlermeldung des Compilers führt, weil die Funktion <em>doSomething</em> nichts am Widget verändern soll.</p>
<p>Ich habe daher diese Funktionssignatur ausprobiert:</p>
<pre><code>void doSomething(const std::unique_ptr&lt;const Widget&gt;&amp; widget);
</code></pre>
<p>Das hat mir aber eine Fehlermeldung für Zeile 24 eingebracht:</p>
<p>VS2013 schrieb:</p>
<blockquote>
<p>1&gt;cppforum\source.cpp(24): error C2664: 'void doSomething(const std::unique_ptr&lt;const Widget,std::default_delete&lt;_Ty&gt;&gt; &amp;)' : cannot convert argument 1 from 'std::unique_ptr&lt;Widget,std::default_delete&lt;Widget&gt;&gt;' to 'const std::unique_ptr&lt;const Widget,std::default_delete&lt;_Ty&gt;&gt; &amp;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Ty=const Widget<br />
1&gt; ]<br />
1&gt; Reason: cannot convert from 'std::unique_ptr&lt;Widget,std::default_delete&lt;Widget&gt;&gt;' to 'const std::unique_ptr&lt;const Widget,std::default_delete&lt;_Ty&gt;&gt;'<br />
1&gt; with<br />
1&gt; [<br />
1&gt; _Ty=const Widget<br />
1&gt; ]<br />
1&gt; No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called</p>
</blockquote>
<p>Der Compiler sieht keine Möglichkeit ein Widget-Objekt in ein const Widget-Objekt umzuwandeln.</p>
<p>Wie löse ich dieses Problem am besten?<br />
Überladen möchte ich die Funktion eigentlich nicht, damit der Anwender bereits an der Signatur erkennt, das sein Widget nicht geändert wird.<br />
Gibt es dafür eine best practice?</p>
<p>Vielen Dank und viele Grüße<br />
Matze</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468308</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Thu, 17 Sep 2015 13:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to Const correctness mit std::unique_ptr on Thu, 17 Sep 2015 13:52:35 GMT]]></title><description><![CDATA[<p>Wenn keine Verschiebung <s>von Widget</s> des Besitzes benötigt wird, einfach als const Referenz - wie früher. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<pre><code>void doSomething(const Widget&amp; widget)
{
  // ..
}

void application()
{
  auto widget = std::make_unique&lt;Widget&gt;();
  doSomething(*widget);
}
</code></pre>
<p>Von Herb Sutter gab es dazu mal einen guten Talk.</p>
<p>// edit<br />
Hier noch der Talk von Herb Sutter: <a href="https://www.youtube.com/watch?v=xnqTKD8uD64" rel="nofollow">https://www.youtube.com/watch?v=xnqTKD8uD64</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468309</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 17 Sep 2015 13:52:35 GMT</pubDate></item><item><title><![CDATA[Reply to Const correctness mit std::unique_ptr on Thu, 17 Sep 2015 13:40:35 GMT]]></title><description><![CDATA[<p>Ja mist, jetzt habe ich zuviel gekürzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Eigentlich ist Widget nur eine Basisklasse und die Funktion hat als Parameter einen</p>
<pre><code>const std::vector&lt;std::unique_ptr&lt;Widget&gt;&gt;&amp;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2468310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468310</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Thu, 17 Sep 2015 13:40:35 GMT</pubDate></item><item><title><![CDATA[Reply to Const correctness mit std::unique_ptr on Thu, 17 Sep 2015 13:40:23 GMT]]></title><description><![CDATA[<p>MatzeHHC schrieb:</p>
<blockquote>
<p>Wie löse ich dieses Problem am besten?</p>
</blockquote>
<p>Indem du es dir gar nicht erst schaffst?<br />
unique_ptr als Funktionsargument ist nur sinnvoll, wenn Ownership tatsächlich übertragen werden soll.<br />
Für einen const unque_ptr&lt;..&gt;&amp; - Funktionsparameter fällt mir kein sinnvoller Anwendungsbereich ein.</p>
<p>Ein einfaches const Resource&amp; oder const Resource* wäre hier angebracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468312</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 17 Sep 2015 13:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to Const correctness mit std::unique_ptr on Fri, 18 Sep 2015 06:31:39 GMT]]></title><description><![CDATA[<p>MatzeHHC schrieb:</p>
<blockquote>
<p>Ja mist, jetzt habe ich zuviel gekürzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Eigentlich ist Widget nur eine Basisklasse und die Funktion hat als Parameter einen</p>
<pre><code>const std::vector&lt;std::unique_ptr&lt;Widget&gt;&gt;&amp;
</code></pre>
</blockquote>
<p>Da könntest du <code>boost::indirect_iterator</code> verwenden und an die <code>doSomething(..)</code> -Funktion ein Iterator-Paar übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468368</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 18 Sep 2015 06:31:39 GMT</pubDate></item><item><title><![CDATA[Reply to Const correctness mit std::unique_ptr on Fri, 18 Sep 2015 08:37:33 GMT]]></title><description><![CDATA[<p>ok, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2468374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2468374</guid><dc:creator><![CDATA[MatzeHHC]]></dc:creator><pubDate>Fri, 18 Sep 2015 08:37:33 GMT</pubDate></item></channel></rss>