1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
// move_if_noexcept example
#include <utility> // std::move_if_noexcept
#include <iostream> // std::cout
// function with lvalue and rvalue reference overloads:
template <class T> void overloaded (T& x) {std::cout << "[lvalue]\n";}
template <class T> void overloaded (T&& x) {std::cout << "[rvalue]\n";}
struct A { // copyable + moveable (noexcept)
A() noexcept {}
A (const A&) noexcept {}
A (A&&) noexcept {}
};
struct B { // copyable + moveable (no noexcept)
B() {}
B (const B&) {}
B (B&&) {}
};
struct C { // moveable only (no noexcept)
C() {}
C (C&&) {}
};
int main () {
std::cout << "A: "; overloaded (std::move_if_noexcept(A()));
std::cout << "B: "; overloaded (std::move_if_noexcept(B()));
std::cout << "C: "; overloaded (std::move_if_noexcept(C()));
return 0;
}
| |