#include <iostream>
#include <string>
#include <utility>
#include <time.h>
std::string func1(const std::string& arg) {
std::string test(arg);
return test;
}
template <typename T>
std::string func2(T&& arg) {
std::string test(std::forward<T&>(arg));
return test;
}
void wrap1(const std::string& arg) {
func1(arg);
}
template <typename T>
void wrap2(T&& arg) {
func2(std::forward<T&>(arg));
}
int main()
{
auto n = 100000000;
/// Passing rvalue
std::cout << "Passing rvalue!" << std::endl;
// Test const l value
auto t = clock();
for (int i = 0; i < n; ++i)
wrap1("test");
std::cout << "const l value: " << clock() - t << std::endl;
// Test rvalue forwarding
t = clock();
for (int i = 0; i < n; ++i)
wrap2("test");
std::cout << "rvalue forwarding: " << clock() - t << std::endl;
std::cout << "Passing lvalue!" << std::endl;
/// Passing lvalue
std::string arg = "test";
// Test const l value
t = clock();
for (int i = 0; i < n; ++i)
wrap1(arg);
std::cout << "const l value: " << clock() - t << std::endl;
// Test rvalue forwarding
t = clock();
for (int i = 0; i < n; ++i)
wrap2(arg);
std::cout << "rvalue forwarding: " << clock() - t << std::endl;
}