Это ошибка в Visual C ++ 2010 или правильное поведение?
template<class T>
T f(T const &r)
{
return r;
}
template<class T>
T f(T &&r)
{
static_assert(false, "no way"); //< line # 10
return r;
}
int main()
{
int y = 4;
f(y); //< line # 17
}
Я думал, что никогда не следует вызывать функцию f (T &&), но она вызывается с T = int &. Выход:
main.cpp(10): error C2338: no way
main.cpp(17) : see reference to function template instantiation 'T f(T)' being compiled
with
[
T=int &
]
Обновление 1 Знаете ли вы какой-нибудь компилятор C ++ x0 в качестве справочного материала? Я пробовал Comeau онлайн-тест-драйв, но не смог скомпилировать ссылку на r-значение.
Обновление 2 Обходной путь (с использованием SFINAE):
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_reference.hpp>
template<class T>
T f(T &r)
{
return r;
}
template<class T>
typename ::boost::disable_if< ::boost::is_reference<T>, T>::type f(T &&r)
{
static_assert(false, "no way");
return r;
}
int main()
{
int y = 4;
f(y);
// f(5); // generates "no way" error, as expected.
}
Обновление 3 Некоторые из компиляторов запускают static_assert (false, "no way"), даже если нет экземпляра шаблона функции. Обходной путь (спасибо @Johannes Schaub - litb)
template<class T> struct false_ { static bool const value = false; };
...
static_assert(false_<T>::value, "no way");
или
static_assert(sizeof(T) == sizeof(T), "no way");