6

重複の可能性:
関数宣言の後の「->」は何ですか?

new キーワードを使用した C++ 関数の次の例に出くわしましたauto。誰かが構文の意味を理解するのを手伝ってくれることを願っていました。

template <class T, class U>
auto add(T t, U u) -> decltype(t + u);

auto f = [](int a, int b) -> int {
   return a*b;
};

具体的には、関数シグネチャのユーザーについて混乱しており、->これらが as で記述されることを期待しています

template <class T, class U>
auto add(T t, U u)
{
    decltype(t + u);
}

auto f = [](int a, int b){
    return a*b;
};

演算子はそこで何をしているの->ですか? この構文についてどこで詳しく知ることができますか?

4

6 に答える 6

13

->オペレーターはそこで何をしているのですか?

それは末尾の戻り値の型です。それ以外の:

int f();

あなたは同等に書くことができます:

auto f() -> int;

戻り値の型が関数のパラメーターの型に依存する場合は、この形式を使用する必要があります。パラメータは、宣言されるまで使用できません。

decltype(t+u) add(T t, U u); // Error: uses `t` and `u` before they're declared
auto add(T t, U u) -> decltype(t + u); // OK

また、ラムダの戻り値の型を指定する場合は、この形式を使用する必要があります。ただし、ご指摘のとおり、多くの場合 (これを含む)、それを指定する必要はまったくありません。

于 2012-10-31T12:55:03.553 に答える
3

[dcl.spec.auto]/2 は、戻り値の型が auto の関数宣言の書き方を説明しています。

auto 型指定子は、そのような宣言子が有効な任意のコンテキストで、末尾の戻り型 (8.3.5) を持つ関数宣言子と共に表示される場合があります。

その後、[dcl.fct]/12 に次のメモがあります。

関数の戻り値の型が複雑な場合、Typedef と末尾の戻り値の型が便利な場合があります。たとえば、上記の関数 fpif は次のように宣言できます。

typedef int IFUNC(int);
IFUNC* fpif(int);

また

auto fpif(int)->int(*)(int)

後続の戻り型は、declarator-id の前に指定するのがより複雑な型に最も役立ちます。

template <class T, class U> auto add(T t, U u) -> decltype(t + u);

それよりも

template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u);
于 2012-10-31T12:57:16.350 に答える
2

この構文 (いわゆるTrailing-return-type ) は、次のように、式を戻り値の型として使用するための回避策です。

template <class T, class U>
   decltype(t + u) add(T t, U u) { ... }

... C++ では正しくありません。

この問題はWikiで十分に説明されていると言わざるを得ません (私はそう思います) 。

于 2012-10-31T12:54:14.447 に答える
1

そこで->演算子は何をしているのですか、そしてこの構文についてどこでもっと学ぶことができますか?

cprogrammingに関するこれについての非常に素晴らしい説明があります。

->(あなたの場合)またはautoを使用することの本質は、便利であり、プログラミングロジックにもっと集中できるようにすることです。

末尾の戻り型(->)は、関数宣言自体に戻り型情報を含めるのに役立ちます。

別の例の場合:

auto add(T t, U u)
{
    decltype(t + u);
}

関数がかなり複雑な場合、プログラムの読者が期待されるリターンタイプを理解するのはかなり困難です(明らかに明らかではありません)。

于 2012-10-31T13:09:52.993 に答える
1

->末尾の戻り型です。

C++11 では、別の関数宣言構文が提案されました。 autoキーワードは通常の関数の戻り値の型の代わりになり、実際の戻り値の型は の後に続き->ます。

例えば、

auto f (int a, int b) -> int;

と同等です

int f(int a, int b);

この機能は、戻り値の型をテンプレート パラメーターから推測する必要があるテンプレート関数で最も役立ちます。

例えば、

template <class T, class U>
auto add(T t, U u) -> decltype(t + u);

戻り値の型は式の型になります(t+u)

于 2012-10-31T13:00:02.390 に答える
0

関数宣言の -> 演算子は、「auto」を返す関数の戻り値の型を指定します。C++11 標準の第 8 章で定義されています。

于 2012-10-31T12:56:58.783 に答える