#include <vector>
using namespace std;
template<typename T, typename = decltype(&T::size)>
void f1(T)
{}
template<typename T, typename = decltype(&T::size)>
void f2(T&)
{}
template<typename T, typename = decltype(&T::size)>
void f3(T&&)
{}
int main()
{
vector<int> coll;
f1(coll); // ok
f2(coll); // ok
f3(coll); // error : no matching function for call to 'f3'
}
main.cpp(21,6): примечание: шаблон кандидата игнорируется: сбой замены [с помощью
T
= >std::vector<int, std::allocator<int> > &
]: тип 'std::vector<int, std::allocator<int> > &
' не может использоваться до '::
', потому что у него нет членов
void f3(T&&)
Мой компилятор clang 4.0.
К моему удивлению, f3(coll)
терпит неудачу, а f1(coll)
и f2(coll)
оба в порядке.
Почему в этом случае ссылка на пересылку не работает?