is_convertible
との違いは何is_assignable
ですか?
なぜ、
vs2012で
is_convertible<int, int&> is false
is_assignable<int, int&> is true
gcc4.7.2で
is_convertible<int, int&> is false
is_assignable<int, int&> is false
is_convertible
との違いは何is_assignable
ですか?
なぜ、
vs2012で
is_convertible<int, int&> is false
is_assignable<int, int&> is true
gcc4.7.2で
is_convertible<int, int&> is false
is_assignable<int, int&> is false
1つの違いは、引数が逆であるということです。
is_convertible<From,To>
From
タイプの式をタイプに変換できることを意味しTo
ます。標準では、への参照を返すTo
行を含む関数を返すという観点からこれを定義しています。右辺値を非定数左辺値参照にバインドできないため、これは誤りです。return create<From>();
create<From>()
From
is_convertible<int,int&>
int
int&
is_assignable<T,U>
タイプの右辺値式をタイプの式U
に割り当てることができることを意味しT
ます。つまり、それt = u;
は整形式です。割り当てられる式は、が左辺値参照の場合は左辺値参照を返し、それ以外の場合は右辺値参照を返す関数呼び出しとして指定されます。これは、が非定数左辺値参照型である場合にのみ真になる可能性があることを意味します。したがって、はfalseです。T
is_assignable<T,U>
T
<int,int&>
VS2012は、 xvaluesへの割り当てを許可するか、の非標準チェックを使用してis_assignable
、間違った結果であると思うものを与えると思います。
アクセス可能な代入演算子がない可能性があるため、一般にコンバーチブルは代入可能を意味しないことに注意してください。代入演算子はあるかもしれませんが、アクセス可能な変換コンストラクターまたは演算子がないため、代入可能は変換可能を意味しません。
gccのバグのようですがis_convertible
、このコンテキストでは次のことを意味します。
int& foo()
{
return 3; //invalid
}
一方is_assignable
、この文脈では、次のことを意味します。
void foo(int& x, int y)
{
y = x; // valid
}