15

通常の代わりに

void foo (void ) {
    cout << "Meaning of life: " << 42 << endl;
}

C++11トレーリングリターンを使用して、allowsは代替手段です

auto bar (void) -> void {
    cout << "More meaning: " << 43 << endl;
}

後者では、何autoを表すように設計されていますか?

別の例、関数について考えてみましょう

auto func (int i) -> int (*)[10] {

}

auto同じ質問ですが、この例ではどういう意味ですか?

4

3 に答える 3

18

一般に、C ++ 11の新しいキーワードautoは、式の型(この場合は関数の戻り型)を式の結果(この場合は。の後に発生するもの)から推測する必要があることを示してい->ます。

これがないと、関数に型がなく(したがって関数ではない)、コンパイラーは混乱してしまいます。

于 2012-09-01T02:03:38.247 に答える
18

コードを考えてみましょう:

template<typename T1, typename T2>
Tx Add(T1 t1, T2 t2)
{
    return t1+t2;
}

ここで、戻りタイプは式に依存し、式は呼び出されるt1+t2方法に依存します。Addあなたがそれを次のように呼ぶ場合:

Add(1, 1.4);

T1になりint、にT2なりますdouble。結果のdouble(int + double)になります。したがって、およびTxを使用して指定する必要があります(必須)auto->

 template<typename T1, typename T2>
    auto Add(T1 t1, T2 t2) -> decltype(t1+t2)
    {
        return t1+t2;
    }

あなたは私の記事でそれについて読むことができます。

于 2012-09-01T05:14:01.183 に答える
1

答えは比較的簡単で、ここでは他の答えには含まれていないと思います。

基本的に、がないと曖昧さが生じるので、委員会は「これらの曖昧さを避けるためにここautoが必要だ」と決定しました。auto

class A {
    T B;
};

class B;

A* f();

f()->B;

さて、どういうf()->B意味ですか?これは、(末尾の戻り型構文を使用して)を返すパラメーターのない関数ですかB、それともへの関数呼び出しA* f()ですか?

末尾のreturn型構文の開始時に必要なものがなかった場合auto、それを判断することはできません。を使用するautoと、これが関数呼び出しであることは明らかです。

したがって、ここでの不明確さを避けるために、末尾の戻り型を使用する関数宣言の開始時に必要です。 auto

于 2021-01-25T22:47:36.947 に答える