В качестве ответа на еще один вопрос я хотел опубликовать следующий код (то есть, я хотел бы опубликовать код на основе этой идеи):
#include <iostream>
#include <utility> // std::is_same, std::enable_if
using namespace std;
template< class Type >
struct Boxed
{
Type value;
template< class Arg >
Boxed(
Arg const& v,
typename enable_if< is_same< Type, Arg >::value, Arg >::type* = 0
)
: value( v )
{
wcout << "Generic!" << endl;
}
Boxed( Type&& v ): value( move( v ) )
{
wcout << "Rvalue!" << endl;
}
};
void function( Boxed< int > v ) {}
int main()
{
int i = 5;
function( i ); //<- this is acceptable
char c = 'a';
function( c ); //<- I would NOT like this to compile
}
Однако, хотя MSVC 11.0 дросселируется при последнем вызове, так как он должен IHMO, MinGW g++ 4.7.1 просто принимает его и вызывает конструктор с формальным аргументом rvalue reference.
Мне кажется, что lvalue привязана к ссылке rvalue. Ответ glib может состоять в том, что lvalue преобразуется в rvalue. Но вопрос в том, является ли это ошибкой компилятора, и если это не так, как это разрешено Священным стандартом?
EDIT: мне удалось свести все это к следующему довольно короткому примеру:
void foo( double&& ) {}
int main()
{
char ch = '!';
foo( ch );
}
Не удается скомпилировать с MSVC 11.0, компилируется ли с MinGW 4.7.1, что правильно?