I know very little C++ and a bit of Rust so there might be mistakes:<p>&gt; Don&#x27;t forget your &amp; in your function declaration or you&#x27;ll silently copy objects.<p>I think this still exists in Rust to a limited extent but it&#x27;s mitigated:<p>* Rust uses move semantics by default, so unless the type was specifically marked as Copy[0] it will be moved into the function which should be noticeable<p>* references are actual types, `&amp;Foo` can&#x27;t be confused with `Foo` and (outside of method receivers) references are created explicitly, so the callsite knows whether it&#x27;s passing a reference<p>&gt; Don&#x27;t forget to make your destructor virtual in your base class (don&#x27;t forget to add it if the class wasn&#x27;t originally going to be a base class!) or you get fun crashes on delete every once in a while.<p>Rust has almost no inheritance support, and the realms of static and dynamic dispatches are pretty well separated (trait objects are dynamic, the rest is mostly static) so that should not be an issue.<p>&gt; Use &quot;explicit&quot; with your one-parameter constructors to avoid fun with automatic conversions.<p>Rust has very little implicit behaviour (auto-deref is the main one I think), and I don&#x27;t think it has implicit&#x2F;automatic conversions.<p>&gt; std::string is practically useless<p>Without more information as to its failing, I can&#x27;t say whether String (and &amp;str) is <i>more useful</i>. IME it certainly is useable and useful.<p>&gt; Use &quot;.&quot; with classes&#x2F;structs&#x2F;references and &quot;-&gt;&quot; pointers (why am I the compiler?!)<p>Yup, this is done through auto-defer (of types implementing the relevant trait of course), though it does have a separate `::` for other context.<p>&gt; Think you know what &quot;a = b;&quot; does? Think you know what the =,==,!=,&lt;,&gt;,^,,+,-,&#x2F;,=,+=,-=,&#x2F;=,^= operators do? Not unless you checked to see if someone override them!<p>Can&#x27;t override assignment itself, you can override other operators[1] and there is an accepted RFC for overloading augmented assignments[2]. Though these overrides are trait-based which should limit the shenanigan space somewhat.<p>&gt; Ever tried to read some code that uses templates?<p>Rust&#x27;s generics are slightly simpler, but they&#x27;re lacking features (no template specialisation currently) so… not sure.<p>&gt; If you declared Class(int x) and Class(char x) and then do Class(&#x27;a&#x27;), it silently gets constructed with the integer version (or maybe it&#x27;s with Class(const char x), can&#x27;t remember, which should say something right there.)<p>See item above, the very declaration doesn&#x27;t exist in Rust, you&#x27;d need to have two separate factory functions.<p>&gt; Quick, what does &quot;const int const x;&quot; mean?<p>Should be clearer in rust, type declarations are fairly regular.<p>&gt; Quick, what does &quot;int* a, b;&quot; do, and is that what you expected?<p>I think that&#x27;s equivalent to `int* a; int b`?<p>Type information is an optional postfix addendum in Rust, so the ambiguity doesn&#x27;t exist, but if you want explicit types you don&#x27;t get the convenience of shortened declaration. The closest to this code would be<p><pre><code>    let (a, b): (Box&lt;u32&gt;, u32)
</code></pre>
which isn&#x27;t much of a gain over<p><pre><code>    let a: Box&lt;u32&gt;;
    let b: u32;
</code></pre>
if you&#x27;re not unpacking an existing structure<p>&gt; Is it safe to do &quot;a = b&quot;? You don&#x27;t know until you read through all the class hierarchies to see if the object has a pointer, and if so, if it has an assignment operator that works properly (&quot;properly&quot; being somewhat relative to the purpose of your object).<p>See above, assignment itself can&#x27;t be overloaded (at least at the moment)<p>&gt; Fun times debugging stuff like<p>I think the only places where braces are optional in Rust are non-ambiguous 1-expression lambdas (`|| {expr}` can be written as `|| expr`) and 1-expression match arms e.g.<p><pre><code>    match foo {
        v1 =&gt; { expr1 },
        v2 =&gt; { expr2 },
    }
</code></pre>
can be written<p><pre><code>    match foo {
        v1 =&gt; expr1,
        v2 =&gt; expr2,
    }
</code></pre>
&gt; Can you call a virtual function from a constructor?<p>Rust doesn&#x27;t have constructors so no. As for the intent, since Rust doesn&#x27;t have constructors you can&#x27;t have partially built values (unless you forcefully partially build them) so the answer should still be no.<p>[0] <a href="http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;marker&#x2F;trait.Copy.html" rel="nofollow">http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;marker&#x2F;trait.Copy.html</a><p>[1] <a href="http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;index.html" rel="nofollow">http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;ops&#x2F;index.html</a><p>[2] <a href="https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;pull&#x2F;953" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;rust-lang&#x2F;rfcs&#x2F;pull&#x2F;953</a>