別の質問への回答として、次のコードを投稿したかった(つまり、このアイデアに基づいたコードを投稿したかった)。
#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はそれを受け入れ、右辺値参照の仮引数を使用してコンストラクターを呼び出します。
左辺値が右辺値参照にバインドされているように見えます。glibの答えは、左辺値が右辺値に変換されるというものである可能性があります。しかし、問題は、これはコンパイラのバグであり、そうでない場合、HolyStandardはこれをどのように許可するのでしょうか。
編集:私はそれをすべて次のかなり短い例に減らすことができました:
void foo( double&& ) {}
int main()
{
char ch = '!';
foo( ch );
}
MSVC 11.0でコンパイルできませんが、MinGW 4.7.1でコンパイルしますか?