fork download
  1. #include <iostream>
  2. #include <type_traits>
  3. #include <string>
  4.  
  5. template<typename Str, typename = std::enable_if_t<!std::is_const<std::remove_reference_t<Str>>::value>>
  6. Str StringReplace(Str&& str, const std::remove_reference_t<Str>& from, const std::remove_reference_t<Str>& to)
  7. {
  8. std::cout << "non-const" << std::endl;
  9. std::cout << __PRETTY_FUNCTION__ << std::endl;
  10. return std::forward<Str>(str);
  11. }
  12.  
  13. template<typename Str, typename = std::enable_if_t<std::is_const<std::remove_reference_t<Str>>::value>>
  14. std::decay_t<Str> StringReplace(Str&& str, const std::remove_reference_t<Str>& from, const std::remove_reference_t<Str>& to)
  15. {
  16. std::cout << "const" << std::endl;
  17. std::cout << __PRETTY_FUNCTION__ << std::endl;
  18. std::decay_t<Str> mutableStr{std::forward<Str>(str)};
  19. StringReplace(mutableStr, from, to);
  20. return mutableStr;
  21. }
  22.  
  23. int main()
  24. {
  25. {
  26. std::cout << "lvalue" << std::endl;
  27. std::string v;
  28. StringReplace(v, "", "");
  29. }
  30.  
  31. {
  32. std::cout << std::endl << "const lvalue" << std::endl;
  33. const std::string v;
  34. StringReplace(v, "", "");
  35. }
  36.  
  37. {
  38. std::cout << std::endl << "lvalue reference" << std::endl;
  39. std::string v;
  40. std::string& vref = v;
  41. StringReplace(vref, "", "");
  42. }
  43.  
  44. {
  45. std::cout << std::endl << "const lvalue reference" << std::endl;
  46. std::string v;
  47. const std::string& vref = v;
  48. StringReplace(vref, "", "");
  49. }
  50.  
  51. {
  52. std::cout << std::endl << "rvalue" << std::endl;
  53. std::string v;
  54. StringReplace(std::move(v), "", "");
  55. }
  56.  
  57. {
  58. std::cout << std::endl << "const rvalue" << std::endl;
  59. const std::string v;
  60. StringReplace(std::move(v), "", "");
  61. }
  62.  
  63. {
  64. std::cout << std::endl << "rvalue reference" << std::endl;
  65. std::string&& v = std::string();
  66. StringReplace(v, "", "");
  67. }
  68.  
  69. {
  70. std::cout << std::endl << "const rvalue reference" << std::endl;
  71. const std::string&& v = std::string();
  72. StringReplace(v, "", "");
  73. }
  74.  
  75. {
  76. std::cout << std::endl << "string literal" << std::endl;
  77. StringReplace<std::string>("", "", "");
  78. }
  79.  
  80. return 0;
  81. }
Success #stdin #stdout 0s 4348KB
stdin
Standard input is empty
stdout
lvalue
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

const lvalue
const
std::decay_t<Str> StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = const std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::decay_t<Str> = std::__cxx11::basic_string<char>; std::remove_reference_t<Str> = const std::__cxx11::basic_string<char>]
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

lvalue reference
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

const lvalue reference
const
std::decay_t<Str> StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = const std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::decay_t<Str> = std::__cxx11::basic_string<char>; std::remove_reference_t<Str> = const std::__cxx11::basic_string<char>]
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

rvalue
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

const rvalue
const
std::decay_t<Str> StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = const std::__cxx11::basic_string<char>; <template-parameter-1-2> = void; std::decay_t<Str> = std::__cxx11::basic_string<char>; std::remove_reference_t<Str> = const std::__cxx11::basic_string<char>]
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

rvalue reference
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

const rvalue reference
const
std::decay_t<Str> StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = const std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::decay_t<Str> = std::__cxx11::basic_string<char>; std::remove_reference_t<Str> = const std::__cxx11::basic_string<char>]
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>&; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]

string literal
non-const
Str StringReplace(Str&&, std::remove_reference_t<Str>&, std::remove_reference_t<Str>&) [with Str = std::__cxx11::basic_string<char>; <template-parameter-1-2> = void; std::remove_reference_t<Str> = std::__cxx11::basic_string<char>]