4

次のコードでは、 wherexは消失したオブジェクトにぶら下がっconst referenceているため、未定義の動作です。

auto get_vec() { return std::vector<int>{1,2,3,4,5}; }
const auto& x = get_vec().back();

すべての警告が有効になっていても、 GCC 7.3Clang 6.0、およびMSVCのいずれも警告を発することができないようです。これらの場合に警告を発する方法があるかどうかは誰にも分かりますか? const auto&これらの場合、 との間に違いはありauto&&ますか?

back()値によって返される場合、存続期間の一時オブジェクト x が関数 scoop に拡張されるため、未定義の動作ではないことに注意してください。

長い話:const auto&変数を初期化するデフォルトの方法として使用されるコードベースがあり、何らかの奇妙な理由でこれらのケースは MSVC を使用して正しく実行されますが、Android 用の Clang でコンパイルすると、発生するたびに誤って割り当てられた値になります。今のところ、ソリューションはconst auto&コードベース全体を調査しているようです。また、多くの場合、const auto&は参照によって返される重いオブジェクトを参照するため、単に を削除するだけで&は解決できません。

もう1つ、私はconst auto&:)のミス使用の責任があります

4

4 に答える 4