它是Visual C++ 2010中的錯誤還是正確的行爲?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(假的, 「沒有辦法」),即使沒有函數模板實例。解決方法(感謝@Johannes紹布 - 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");
我不知道這是否是Visual c + +的特點,`static_assert(false,...)`不總是觸發?在G ++中,斷言必須依賴於模板參數才能觸發,除非函數被實例化。 – UncleBens 2011-02-18 19:32:12
我認爲這是一個Visual C++「功能」。對其他編譯器使用'static_assert(sizeof(T)== sizeof(F),「no way」))。 – 2011-02-18 22:51:03
違規當然不是一項功能。無論如何,`sizeof(T)== 0`是使斷言總是失敗的好方法,但依賴於它。 (我有一個'always_false ::價值'模板躺在。) –
GManNickG
2011-02-18 23:11:27