aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/nrvo_by_default/rvo.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--nrvo_by_default/rvo.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/nrvo_by_default/rvo.cpp b/nrvo_by_default/rvo.cpp
new file mode 100644
index 0000000..f8c8f32
--- /dev/null
+++ b/nrvo_by_default/rvo.cpp
@@ -0,0 +1,73 @@
+#include <iostream>
+#include <utility>
+
+namespace
+{
+ class C
+ {
+ public:
+ explicit C()
+ {
+ std::cout << "\tC::C()\n";
+ }
+
+ C(C&&) noexcept
+ {
+ std::cout << "\tC::C(C&&)\n";
+ }
+
+ C(const C&)
+ {
+ std::cout << "\tC::C(const C&)\n";
+ }
+
+ C& operator=(C&&) noexcept
+ {
+ std::cout << "\tC::operator=(C&&)\n";
+ return *this;
+ }
+
+ C& operator=(const C&)
+ {
+ std::cout << "\tC::operator=(const C&)\n";
+ return *this;
+ }
+
+ ~C()
+ {
+ std::cout << "\tC::~C()\n";
+ }
+ };
+
+ C make_rvo()
+ {
+ return C{};
+ }
+
+ C make_nrvo()
+ {
+ C c;
+ return c;
+ }
+}
+
+int main()
+{
+ {
+ std::cout << "C c\n";
+ C c;
+ }
+ {
+ std::cout << "C c(make_rvo())\n";
+ C c(make_rvo());
+ }
+ {
+ std::cout << "C c{make_rvo()}\n";
+ C c{make_rvo()};
+ }
+ {
+ std::cout << "C c = make_rvo()\n";
+ C c = make_rvo();
+ }
+ return 0;
+}