#include <bits/stdc++.h>
using namespace std;
template<class T = string>
void f(T &&s) {
cout << s << endl;
}
int main() {
string s("1234");
f(s);
f("1234");
return 0;
}
可以编译。
#include <bits/stdc++.h>
using namespace std;
void f(string &&s) {
cout << s << endl;
}
int main() {
string s("1234");
f(s);
f("1234");
return 0;
}
我将T
替换为string
,无法编译代码。
错误:
❯ g++-8 -std=c++11 a.cpp && ./a.out
a.cpp: In function 'int main()':
a.cpp:10:11: error: cannot bind rvalue reference of type 'std::__cxx11::string&&' {aka 'std::__cxx11::basic_string<char>&&'} to lvalue of type 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'}
f(s);
^
a.cpp:4:10: note: initializing argument 1 of 'void f(std::__cxx11::string&&)'
void f(string &&s) {
^
我很困惑。
答案 0 :(得分:0)
模板类型推断有一些例外。 如果函数模板接收到右值引用,而我们传入了左值引用,则编译器会将其推断为左值引用。这就是std :: move正常工作的原因。
template <typename T>
typename remove_reference<T>::type&& move(T&& t)
{
return static_cast<typename remove_reference<T>::type&&>(t);
}