4
void f1(int (&)[8])
{}

void f2(int (&)[])
{}

int main()
{
    int a[8];

    f1(a); // OK

    f2(/* What should I put here? */); // ???

    return 0;
}

f2を呼び出すにはどうすればよいですか?

PS:void f2(int(&)[]){}はVC++2012では有効です。

次のことを考慮してください。

template<class T>
struct A
{};

template<class T>
struct A<T[]>
{};

template<class T, size_t size>
struct A<T[size]>
{};
4

2 に答える 2

5

「f2」はそもそもコンパイルすべきではありません。[]が間接参照の最初のレベルである場合にのみ、配列パラメーターのサイズを省略できます。この場合、実際には配列ではなくポインターです。この場合、間接参照の最初のレベルは&であるため、[]のサイズを省略できません。

于 2012-10-16T07:13:48.853 に答える
5

C ++には、パラメーターとして境界のない配列への参照またはポインターを許可しないという明示的な規則があります(ただし、それ以外の場合は有効な型です)。以下は、そのようなパラメータに対する有効な引数になります

extern int arg[];

サイズのある配列は使用できないことに注意してください。C++には型互換性の概念がありません。Cは、サイズのない配列型を、サイズのある対応する配列型と互換性のあるものにします。C ++では、型システムはより厳密であり、型にはリンケージがあり、プロトタイプのない関数型は存在しないため、型の互換性は実際には必要ないため、C++はそれを削除しました。

于 2012-10-16T07:32:06.700 に答える