7

重複の可能性:
is_convertible is_assignable の違いは何ですか

私はこのテストコードを使用します:

cout<<std::is_assignable<int, int>::value<<endl;
cout<<std::is_assignable<int, char>::value<<endl;
cout<<std::is_assignable<int&, int>::value<<endl;
cout<<std::is_assignable<int&, char>::value<<endl;
cout<<std::is_assignable<int, int&>::value<<endl;
cout<<std::is_assignable<int, char&>::value<<endl;

vs2012 での結果は次のとおりです。

true
true
true
true
true
true

gcc4.7.2 では次のようになります。

false
false
true
true
false
false

基準に従って正しい結果はどれか。

4

2 に答える 2

6

is_assignable<T,U>次の場合は true です。

表現declval<T>() = declval<U>()が整っている

declval<T>への参照を返す関数として宣言されていますT

template <class T>
  typename add_rvalue_reference<T>::type declval() noexcept;

がオブジェクト型または関数型の場合はadd_rvalue_reference<T>::type右辺参照型 ( T&&)、参照型の場合はそれ自体です。TT

これは、がconst でない左辺値参照型is_assignable<T,U>である場合にのみ true になることを意味します。オブジェクト型の場合は右辺値参照型です。したがって、式は代入できないxvalueです。Tadd_rvalue_reference<T>::typedeclval<T>()

したがって、標準を読み違えていない限り、GCC は正しく、VS2012 は間違っています。真実であることがより理にかなっているように見えるかもしれませんがis_assignable<int,int>、そうではありません。

于 2012-12-19T15:39:31.207 に答える
3

is_assignable<T,U>::valuedeclval<T>() = declval<U>()が整形式の場合はtrueとしてdeclval<T>定義され、を返す関数として定義されますadd_rvalue_reference<T>::type

割り当ては、左側のオペランドとして変更可能な左辺値に対してのみ有効であることを覚えておく必要があります。また、参照の折りたたみのルール(特に最後の2つ)を覚えておいてください。

T&  &  -> T&
T&& &  -> T&
T&  && -> T&
T&& && -> T&&

したがって、それぞれの場合:

  1. is_assignable<int, int>is_assignable<int, char>

    右辺値参照(xvalue)を返す関数の結果を、右辺値参照(別のxvalue)を返す別の関数の結果に割り当てることはできますか?いいえ、できません。これはである必要がありますfalse

  2. std::is_assignable<int&, int>std::is_assignable<int&, char>

    右辺値参照(xvalue)を返す関数の結果を左辺値参照(左辺値)を返す関数の結果に割り当てることはできますか?確かにできます。これはである必要がありますtrue

  3. std::is_assignable<int, int&>std::is_assignable<int, char&>

    左辺値参照(左辺値)を返す関数の結果を、右辺値参照(x値)を返す関数の結果に割り当てることはできますか?いいえ、できません。これはである必要がありますfalse

つまり、GCCはここにあります。

于 2012-12-19T15:40:10.503 に答える