Visual C++ 2010, rvalue reference bug?

Posted by Sergey Shandar on Stack Overflow See other posts from Stack Overflow or by Sergey Shandar
Published on 2011-02-18T06:27:08Z Indexed on 2011/02/18 7:25 UTC
Read the original article Hit count: 208

Is it a bug in Visual C++ 2010 or right behaviour?

template<class T>
T f(T const &r)
{
    return r;
}

template<class T>
T f(T &&r)
{
    static_assert(false, "no way");
    return r;
}

int main()
{
    int y = 4;
    f(y);
}

I thought, the function f(T &&) should never be called but it's called with T = int &. The output:

main.cpp(10): error C2338: no way
      main.cpp(17) : see reference to function template instantiation 'T f<int&>(T)' being compiled
      with
      [
          T=int &
      ]

Update 1 Do you know any C++x0 compiler as a reference? I've tried comeau online test-drive but could not compile r-value reference.

Update 2 Workaround (using 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.
}

© Stack Overflow or respective owner

Related posts about c++

Related posts about visual-c++