{"id":1699,"date":"2024-05-23T22:00:33","date_gmt":"2024-05-24T05:00:33","guid":{"rendered":"http:\/\/75.119.134.73\/?p=1699"},"modified":"2024-05-23T22:04:33","modified_gmt":"2024-05-24T05:04:33","slug":"do-not-return-const-reference","status":"publish","type":"post","link":"https:\/\/nanzhou.cc\/index.php\/2024\/05\/23\/do-not-return-const-reference\/","title":{"rendered":"Do not return const reference"},"content":{"rendered":"\n<p>Unless you really need to expose a read-only reference to clients (rare). <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\n#include &lt;iostream&gt;\n\nclass Struct {\n public:\n  Struct() {}\n  Struct(const Struct&amp;) { std::cout &lt;&lt; \"Copy constructor\\n\"; }\n  Struct(Struct&amp;&amp; other) { std::cout &lt;&lt; \"Move constructor\\n\"; }\n  Struct&amp; operator=(Struct&amp;&amp; other) {\n    std::cout &lt;&lt; \"Move assignment\\n\";\n    return *this;\n  }\n\n  Struct&amp; operator=(const Struct&amp;) {\n    std::cout &lt;&lt; \"Copy assignment\\n\";\n    return *this;\n  }\n\n private:\n  int a = 0;\n};\n\nstruct Data {\n  Data() {}\n  const Struct&amp; Func1() { return a; }\n  Struct Func2() { return a; }\n  Struct a;\n};\n\nint main() {\n  Data data;\n  std::cout &lt;&lt; \"Struct a = data.Func1();\" &lt;&lt; '\\n';\n  Struct a = data.Func1();\n  std::cout &lt;&lt; '\\n';\n\n  std::cout &lt;&lt; \"const Struct&amp; b = data.Func1();\" &lt;&lt; '\\n';\n  const Struct&amp; b = data.Func1();\n  std::cout &lt;&lt; '\\n';\n\n  std::cout &lt;&lt; \"Struct c = data.Func2();\" &lt;&lt; '\\n';\n  Struct c = data.Func2();\n  std::cout &lt;&lt; '\\n';\n\n  std::cout &lt;&lt; \"const Struct&amp; d = data.Func2();\" &lt;&lt; '\\n';\n  const Struct&amp; d = data.Func2();\n  std::cout &lt;&lt; '\\n';\n\n  return 0;\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">Struct a = data.Func1();\nCopy constructor\n\nconst Struct&amp; b = data.Func1();\n\nStruct c = data.Func2();\nCopy constructor\n\nconst Struct&amp; d = data.Func2();\nCopy constructor\n<\/code><\/pre>\n\n\n\n<p>Thread safety is also a problem<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">\/\/ (Bad) Returned reference needs another synchronization to read.\nconst Data&amp; GetData() {\n  ReaderMutexLock lock(&amp;mutex_protecting_data_);\n  return data_;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Unless you really need to expose a read-only reference to clients (rare). Thread safety is also a problem<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"0","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,5],"tags":[],"class_list":["post-1699","post","type-post","status-publish","format-standard","hentry","category-c","category-proglang"],"_links":{"self":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/posts\/1699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/comments?post=1699"}],"version-history":[{"count":2,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/posts\/1699\/revisions"}],"predecessor-version":[{"id":1703,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/posts\/1699\/revisions\/1703"}],"wp:attachment":[{"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/media?parent=1699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/categories?post=1699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nanzhou.cc\/index.php\/wp-json\/wp\/v2\/tags?post=1699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}