web-dev-qa-db-ja.com

警告:関数は、戻り値の型を末尾に付けずに「auto」型指定子を使用します

次のコードは、以下の警告を示します。誰かが理由を説明できますか(完全な例を作成するために型をintに置き換えたため、コードはそのままでは役に立たないことに注意してください)。

警告: 'MaxEventSize()'関数は 'auto'型指定子を末尾の戻り値の型なしで使用します[デフォルトで有効]

アイデアは、特定の構造の最大サイズを取得することです(タイプはintの場所に移動します)。

template<typename T>
constexpr T cexMax(T a, T b)
{
    return (a < b) ? b : a;
}

constexpr auto MaxEventSize()
{
    return cexMax(sizeof(int),
           cexMax(sizeof(int),
                    sizeof(int)));
};
6
Ashley Duncan

「末尾の戻り値の型なし」のauto戻り値の型はC++ 14の機能なので、C++ 11をコンパイルしていると思います。

コードはC++ 14で問題ありませんが、C++ 11の場合、戻り値の型としてautoを使用する場合は、このように有効な戻り値の型を記述する必要があります(注意:擬似コード)

_auto funcName (args...) -> returnType
_

sizeof()が_std::size_t_を返すことを知っているので、例は次のように修正できます。

_constexpr auto MaxEventSize() -> std::size_t
{
    return cexMax(sizeof(int),
           cexMax(sizeof(int),
                    sizeof(int)));
};
_

または(この場合はばかげていますが、より複雑な例で使用法を示しています)

_constexpr auto MaxEventSize() -> decltype( cexMax(sizeof(int),
                                                  cexMax(sizeof(int),
                                                         sizeof(int))) )
{
    return cexMax(sizeof(int),
           cexMax(sizeof(int),
                    sizeof(int)));
};
_
16
max66