Yeah I dunno, the &quot;solid technical reasons&quot; are pretty unconvincing. The reasons are:<p>1. Exceptions are awkward because they separate the error handling from the context that is usually required to correctly handle an error (i.e. where it occured).<p>2. Exceptions are the only reasonable way for a constructor to fail. You can&#x27;t return error codes from a constructor.<p>I actually agree with the point about exceptions, and I&#x27;m glad Rust didn&#x27;t use them. That said, the solution is trivial (and the author admits it) - don&#x27;t use exceptions.<p>The second point is also actually a fairly good one, and again Rust has fixed this - it uses static `new()` initialisers that create object (or not, if they fail). Fortunately we can actually copy this method in C++. Here&#x27;s an example for a network connection object:<p><pre><code>    class Connection
	{
	public:
		static boost::optional&lt;Connection&gt; connect(string host)
		{
			&#x2F;&#x2F; Try to connect.
			int connectionHandle = -1;
			int rc = connect(host, &amp;connectionHandle);

			&#x2F;&#x2F; If it fails return none.
			if (rc &lt; 0)
				return boost::none;
				
			&#x2F;&#x2F; Otherwise return the new object.
			return new Connection(connectionHandle);	
		}
		
		void send();
		void recv();
		void etc();

	private:
		explicit Connection(int connectionHandle)
		{
			mHandle = connectionHandle;
		}
		
		int mHandle;
	}
</code></pre>
Unfortunately as far as I can see there is no Rust-like `result&lt;&gt;` type in Boost or the standard library yet, but it would be fairly easy to write your own.<p>It seems pretty crazy to give up C++ for these fixable flaws. Especially given how many unfixable flaws C has.