25

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
4

2 に答える 2

14

1つの違いは、引数が逆であるということです。

is_convertible<From,To>Fromタイプの式をタイプに変換できることを意味しToます。標準では、への参照を返すTo行を含む関数を返すという観点からこれを定義しています。右辺値を非定数左辺値参照にバインドできないため、これは誤りです。return create<From>();create<From>()Fromis_convertible<int,int&> intint&

is_assignable<T,U>タイプの右辺値式をタイプの式Uに割り当てることができることを意味しTます。つまり、それt = u;は整形式です。割り当てられる式は、が左辺値参照の場合は左辺値参照を返し、それ以外の場合は右辺参照を返す関数呼び出しとして指定されます。これは、が非定数左辺値参照型である場合にのみ真になる可能性があることを意味します。したがって、はfalseです。Tis_assignable<T,U>T<int,int&>

VS2012は、 xvaluesへの割り当てを許可するか、の非標準チェックを使用してis_assignable、間違った結果であると思うものを与えると思います。

アクセス可能な代入演算子がない可能性があるため、一般にコンバーチブルは代入可能を意味しないことに注意してください。代入演算子はあるかもしれませんが、アクセス可能な変換コンストラクターまたは演算子がないため、代入可能は変換可能を意味しません。

于 2012-12-19T12:45:27.507 に答える
3

gccのバグのようですがis_convertible、このコンテキストでは次のことを意味します。

int& foo()
{
    return 3; //invalid
}

一方is_assignable、この文脈では、次のことを意味します。

void foo(int& x, int y)
{
    y = x; // valid
}
于 2012-12-19T12:32:11.460 に答える