5

次のプログラムを別のコンパイラでコンパイルしましたが、動作が異なります。

ソース :

#include <iostream>
#include <sstream>
#include <unordered_map>

using namespace std ;

std::unordered_map<std::string,std::string> mymap;
std::unordered_multimap<std::string,std::string> mymultimap;
int main ()
{
    DoAddItem() ;

    std::cout << "mymap contains:";
    for ( auto it = mymap.begin(); it != mymap.end(); ++it )
        std::cout << " " << it->first << ":" << it->second;
    std::cout << std::endl;

    std::cout << "============================================" << std::endl ;
    std::cout << "mymultimap contains:";
    for ( auto it2 = mymultimap.begin(); it2 != mymultimap.end(); ++it2 )
        std::cout << " " << it2->first << ":" << it2->second;
    std::cout << std::endl;
    return 0;
} 

void  DoAddItem() 
{
    std::pair<std::string,std::string> mypair[100]; 
    int idx ;
    std::string s1  ;
    std::string s2  ;
    for(idx=0;idx<10;idx++)
    {
        s1 = string("key") + int2str(idx) ;
        s2 = string("val") + int2str(idx) ;
        mypair[idx] = {s1,s2} ;
        mymap.insert(mypair[idx]) ;
        mymultimap.insert(mypair[idx]) ;
    }//for 
    return ; 
}

RedHat Linux の g++ 4.4.6 でコンパイル:

g++  --std=c++0x unordered_map1.cpp -o unordered_map1.exe 

mymap と mymultimap の正しい答えが得られますが、MinGw では: http://sourceforge.net/projects/mingwbuilds/?source=dlp

次のようにコンパイルします。

g++ -std=gnu++11 unordered_map1.cpp -o unordered_map1.exe

今回は、mymap はまだ正しい答えを取得しますが、mymultimap はすべて空です。MinGw g++ バージョンは

g++ (rev1、MinGW-builds プロジェクトによってビルド) 4.8.1

私は c++11 に興味があるので、Winx で MinGw コンパイラをダウンロードします。私の開発コンパイラである g++ 4.4.6 は、テスト用に c++11 をコンパイルできません。

私が逃したものは何ですか?私の目標は c++11 をテストすることです。どんな提案でも大歓迎です!!

編集 :

mymultimap.insert(mypair[idx]) ;   //won't work !!
mymultimap.insert(make_pair(s1,s2)) ; //This work !!

コードを make_pair に変更した後、MinGw で動作し、mymultimap の正しい答えを出力します ....それは私には奇妙ですが ~~

4

1 に答える 1

3

バグ ファイル http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57619

これはmingwとは直接関係ありません。g++4.8でコンパイルされたテスト ケースにも同じ問題があります。ただし、ideone で g++4.7.2 を使用してコンパイルされた同じテスト ケースには、この問題はありません。これは g++4.8 のバグであり、報告する必要があります (または、私に知らせてください。報告します)。

何が起こっている:

への呼び出しmymap.insert(mypair[0]);は、文字列を から移動していますstd::pair。そのため、mymultimap.insert(mypair[0]);が呼び出されたとき、文字列は既に移動されています。

最小のテスト ケースは次のとおりです。

std::unordered_map<std::string,std::string> mymap;
std::unordered_multimap<std::string,std::string> mymultimap;
int main ()
{
    std::pair<std::string,std::string> mypair[1]; 
    std::string s1 = std::string("key");
    std::string s2 = std::string("val");
    mypair[0] = {s1,s2};
    mymap.insert(mypair[0]);
    mymultimap.insert(mypair[0]);
    std::cout << "mymultimap contains:";
    for ( auto it2 = mymultimap.begin(); it2 != mymultimap.end(); ++it2 )
        std::cout << " " << it2->first << ":" << it2->second;
}
于 2013-06-11T21:12:00.967 に答える