1

これにはVisualStudioバージョン2005および2012を使用しています。以下のコードはコンパイルされ、vs2005では問題はありませんが、vs2012ではエラーが発生します。作業中のコードを、コンパイルして実行する以下のサンプルまで抽出しました(vs2005)

#include <map> 

//Arbitrary class
class SimpleClass
{
private:
     int member;

public:
     explicit SimpleClass( int i ) : member(i) {}
     operator int() const { return member;} 
};

//In code I have a map with these types and make_pair is invoked
//when an insert occurs into that map
typedef std::pair<SimpleClass,SimpleClass> SCPair;

//simple fn to replace myMap.insert(...)
void lvalref_test( const SCPair& sp )
{
    return;
}

int main( unsigned int argc, const char** argv ) 
{
     const int anInt = 2;
     //make_pair creates a pair<SimpleClass,SimpleClass> from
     //the instance of pair<int,SimpleClass> in the normal way
     //and Because SimpleClass is constructable from an int, 
     //the creation succeeds (In vs2005)
     lvalref_test( std::make_pair( anInt, SimpleClass(1) ) );
     return 0;
}

vs2012は私に与えます:

エラーC2664:'lvalref_test':パラメータ1を'std :: pair <_Ty1、_Ty2>'から'const SCPair&'に変換できません

両方のstd::pair実装の違いを見てきました

vs2005

template<class _Other1,
    class _Other2>
    pair(const pair<_Other1, _Other2>& _Right)
    : first(_Right.first), second(_Right.second)
    {   // construct from compatible pair
    }

vs2012

template<class _Other1,
    class _Other2>
    pair(const pair<_Other1, _Other2>& _Right,
        typename enable_if<is_convertible<const _Other1&, _Ty1>::value
            && is_convertible<const _Other2&, _Ty2>::value,
            void>::type ** = 0)
    : first(_Right.first), second(_Right.second)
    {   // construct from compatible pair
    }

が行動の変化を引き起こしていると思いenable_ifますが、その理由はよくわかりません。

表示されたエラーを修正する方法を知っています。SimpleClassのインスタンスを通過でき、すべてが正常でダンディです。ここでの私の質問は、これでも正しいテンプレートパラメータを推測し、正しいペアタイプを作成する必要があるかどうかです。この動作は変更されましたか、それともどこかで間違いを犯しましたか?

答えは「はい」です。間違いを犯しました。明らかなexplicitキーワードを全体的に無視し、メカニズムに真っ向から飛び込みました。

4

1 に答える 1

3

コンパイルしないでください。コンストラクターには明示的な構文が必要ですが、ペアを暗黙的に変換しようとすると、暗黙的な変換を実行しようとします。厳密には、これはコンパイルされるべきではありませんでした。

VS2005の動作は不十分です。これは、標準の欠陥によるものか、欠陥があるためかです。VS2012の動作は正しいです。

于 2012-10-31T13:43:49.377 に答える