<div dir="ltr">Hi Alex<div><br></div><div>I need clarification on code guidelines rule 44:</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><div>44. (C, C++, C# and Java only) Type conversions must always be done explicitly. Never rely on implicit type conversion.</div>

</div><div><div><font face="courier new, monospace">floatValue = (float)intValue; // NOT: floatValue = intValue;</font></div></div><div><div>By this, the programmer indicates that he is aware of the different types involved and that the mix is intentional.</div>

</div></blockquote><div><br></div><div><br></div><div>Which of the following are allowed?<br></div><div><br></div><div><font face="courier new, monospace">//01</font></div><div><font face="courier new, monospace">std::string x = "example"; // char[] is implicitly converted to std::string</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">//02</font></div><div><font face="courier new, monospace">uint64_t n = 1 + 1; // int is implicitly converted to uint64_t</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">//03</font></div><div><font face="courier new, monospace">uint64_t a = static_cast<uint64_t>(1);</font></div><div><font face="courier new, monospace">uint32_t b = static_cast<uint32_t>(2);</font></div>

<div><font face="courier new, monospace">if (a == b) { // uint32_t is implicitly converted to uint64_t</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div>

<div><font face="courier new, monospace">//04</font></div><div><font face="courier new, monospace">void func(std::string x);</font></div><div><font face="courier new, monospace">func("example"); // char[] is implicitly converted to std::string</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">//05</font></div><div><font face="courier new, monospace">uint8_t x = tlv::Interest; // enum is implicitly converted to uint8_t</font></div>

<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">//06</font></div><div><font face="courier new, monospace">int x = 1;</font></div><div><font face="courier new, monospace">float y = x;</font></div>

<div><br></div><div><br></div><div>My opinion is to allow:</div><div><ul><li>numeric literals and enum members to any numeric type</li><ul><li>allows 02 05 above</li></ul><li>implicit conversion from T[] to std::basic_string<T></li>

<ul><li>allows 01 04 above</li></ul></ul></div><div>and disallow:</div><div><ul><li>implicit conversion between numeric types</li><ul><li>disallows 03 06 above</li></ul><li>use of implicit constructors (in most cases)<br>

</li><ul><li>This also means constructor taking one argument should be marked explicit.<br></li></ul><li>use of implicit conversion operators (in most cases)</li></ul></div><div><br></div><div>Yours, Junxiao</div></div>