2

私は非常に単純な方法を持っており、それを過負荷にしています。

Sy_animatable::PropertyTimeLine&
Sy_animatable_imp::getPropertyTimeLine( const QString& property )
{
    if ( !properties_.contains( property ) ) {
        throw Sy_unknownAnimPropertyException( property );
    }

    return properties_[property];
}

const Sy_animatable::PropertyTimeLine&
Sy_animatable_imp::getPropertyTimeLine( const QString& property ) const
{
    if ( !properties_.contains( property ) ) {
        throw Sy_unknownAnimPropertyException( property );
    }

    return properties_[property];  // "warning: returning reference to temporary"
}

私は2つの理由で警告を理解していません:

  1. properties_はメンバー変数であり、その添え字演算子(これはa QMap)は参照を返すため、一時的なものがあってはならず、オブジェクトの存続期間中は永続的です。
  2. 警告が元のオーバーロードではなくconstオーバーロードに表示されるのはなぜですか?

警告を非表示にする行はでき#pragmaますが、なぜ警告が表示されるのかを知りたいのですが、何か提案はありますか?

4

2 に答える 2

8

-operator []for にQMapは奇妙なセマンティクスがあり、(指定されたキーを持つ要素がない場合) 一時的なものへの const 参照を生成することがあり、その有効期間は十分に延長されていないようです。

return properties_.find(property).value();代わりに試してください。

于 2012-04-15T16:37:05.943 に答える
2

QMapでは、ちょっとoperator[]()風変わりです。マップに(キー、値)ペアを挿入することも、値を検索するために使用することもできます。ドキュメントには次のように記載されています。

値を検索するには、operatorまたはvalue()を使用します。

int num1 = map["thirteen"];
int num2 = map.value("thirteen");

マップに指定されたキーを持つアイテムがない場合、これらの関数はデフォルトで作成された値を返します。

QMap::value()指定されたキーがマップにない場合は、デフォルトで構築された値を返します。つまり、デフォルトのコンストラクターを使用して値が作成されます。これは、表示されている一時的な警告です。operator[]()(キー、値)ペアがすでに存在する場合はサイレントに挿入しませんが(存在しない場合は挿入します)、警告が消えるかどうかはわかりませんが、を使用する.value()方法があります。

于 2012-04-15T16:48:11.973 に答える