1. ホーム
  2. c++

ラムダの戻り値型は戻り値から推測できるのに、なぜ関数の戻り値型はできないのでしょうか?

2023-11-24 20:16:11

疑問点

#include <iostream>

int main(){

    auto lambda = [] {
        return 7;
    };

    std::cout << lambda() << '\n';

}

このプログラムは、コンパイルして7を表示します。

ラムダの戻り値は7という値から整数型に推論されます。


なぜ普通の関数ではできないのでしょうか?

#include <iostream>

auto function(){
    return 42;
}

int main(){

    std::cout << function() << '\n';
}

error: 'function' 関数が 'auto' 型指定子を使用しており、末尾に戻り値の型がない。

どのように解決するのですか?

C++14 にはこの機能があります。 . 新しいバージョンの GCC や clang でテストする場合は -std=c++1y フラグを設定することで、新しいバージョンの GCC や clang でテストすることができます。

ライブの例

これに加えて、C++14 では、以下のように decltype(auto) (これは decltype(auto) を使用して戻り値を推論することができます。 decltype セマンティクスを使用します。

例として、転送関数では decltype(auto) は特に有用です。

template<typename function_type, typename... arg_types>
decltype(auto) do_nothing_but_forward(function_type func, arg_types&&... args) {
    return func(std::forward<arg_types>(args)...);
}

を使うことで decltype(auto) の実際の戻り値の型を模倣しています。 func の実際の戻り値を模倣しています。C++11 で非常にイライラし、エラーを起こしやすい、末尾の戻り値の型のコードの重複はもうありません。