15

このC++1yコード ( LIVE EXAMPLE ) を考えてみましょう:

#include <iostream>

auto foo();

int main() {
    std::cout << foo();   // ERROR!
}

auto foo() {
    return 1234;
}

コンパイラ (GCC 4.8.1) は、寛大にも次のエラーを出します。

main.cpp: 関数 'int main()' 内:
main.cpp:8:18: エラー: 'auto' の推定前に 'auto foo()' を使用<br> std::cout << foo();
                   ^

ここで前方宣言するにはどうすればよいfoo()ですか? または、より適切に、前方宣言することは可能foo()ですか?


foo()また、ファイルで宣言しようとしたコードをコンパイルして、上記のファイルと同じよう.hに定義し、 と への呼び出しを含むファイルに含め、それらをビルドしました。foo().cpp.hmain.cppint main()foo()

同じエラーが発生しました。

4

1 に答える 1

19

N3638で提案された論文によると、そうすることが明示的に有効です。

関連スニペット:

auto x = 5;                // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
static auto y = 0.0;       // OK: y has type double
auto int r;                // error: auto is not a storage-class-specifier
auto f() -> int;           // OK: f returns int
auto g() { return 0.0; }   // OK: g returns double
auto h();                  // OK, h's return type will be deduced when it is defined

ただし、次のように続けます。

式の型を判別するために推定されないプレースホルダー型を持つエンティティの型が必要な場合、プログラムは不適切な形式です。ただし、return ステートメントが関数内に表示されると、そのステートメントから推定される戻り値の型を、他の return ステートメントを含む関数の残りの部分で使用できます。

auto n = n;            // error, n's type is unknown
auto f();
void g() { &f; }       // error, f's return type is unknown
auto sum(int i) {
  if (i == 1)
    return i;          // sum's return type is int
  else
    return sum(i-1)+i; // OK, sum's return type has been deduced
}

したがって、定義される前に使用したという事実により、エラーが発生します。

于 2013-06-24T06:17:04.270 に答える