4

私はこのような構造体を持っています:

struct VrtxPros{
    long idx;
    std::vector<std::string> pros;
    VrtxPros(const long& _idx=-1, const std::string& val="") : idx(_idx)
    {
         if ( !val.empty() && val!="" )
             pros.push_back(val);
    }
};

コードの後半では、次のように使用します。

long idx = 1234;
VrtxPros vp( 2134, std::string("-1") );
if ( margin ) vp.pros[0] = idx;

コンパイラはそれで問題ありません。オペレーターが参照を提供する必要があるため、私は疑問に思っています。ソースとして longを受け入れる が見つかりませんでした。operator=std::string

コードがコンパイルされるのはなぜですか?

4

2 に答える 2

5

astd::stringは a に代入できchar、 alongは暗黙的に acharに変換できるため、 astd::stringを a に代入できますlong。コンパイラは、おそらくこの種の暗黙的な変換について警告を発します (警告レベルを上げると、まだ表示されていない場合は表示されます)。

ここにoperator=リストされている #4 を参照してください。コンストラクターのオーバーロードは char だけを受け取るのではないことに注意してください。したがって、この種のことは割り当てに対してのみ実行できます。

さらに言えば、これも行うことができます:

std::string wow;
wow = 7ull; // implicit unsigned long long to char conversion
wow = 1.3f; // implicit float to char conversion
于 2012-07-20T20:44:55.473 に答える
1

g ++の場合は-Wconversionを使用して、longからcharへの暗黙的な変換に関する警告を取得します。

于 2012-07-20T20:50:21.913 に答える