7

次の C ソース コードがあるとします。

const int foo(void)
{
    return 42;
}

gccエラーなしでコンパイルされますが、-Wextraまたはを使用-Wignored-qualifiersすると、次の警告が表示されます。

warning: type qualifiers ignored on function return type

たとえば、演算子のオーバーロードのコンテキストで、 C++ でconst関数と非関数を区別する正当な理由があることを理解しています。const

しかし、単純な C ではgcc、エラーが発生しない理由、またはより簡潔に言えば、標準でconst関数が許可されている理由がわかりません。

関数の戻り値の型に型修飾子を使用できるのはなぜですか?

4

3 に答える 3

4

検討:

#include <stdio.h>

const char* f()
{
    return "hello";
}
int main()
{
    const char* c = f();

    *(c + 1) = 'a';

    return 0;
}

const戻り値で許可されていない場合、コードはコンパイルされます(実行時に未定義の動作が発生します)。

const関数が変更不可能なものへのポインタを返す場合に役立ちます。

于 2012-08-21T10:04:25.877 に答える
2

関数から返される値がとして修飾されているかどうかは関係ありませんconst

修飾されていなくても、返される値を変更することはできません。

foo() = -42; /* impossible to change the returned value */

したがって、使用constは冗長です(通常は省略されます)。

于 2012-08-21T10:02:35.037 に答える
2

ポインター型には意味があるので、単に文法を単純に保つだけなので、constポインター以外の戻り値をエラーにする価値があるとは誰も考えていないと思います。

constまた、C++ の定数メソッドはlastを持つことによって宣言されるため、C++ との比較は少しずれています。

int foo() const;

constであるメソッドと戻り値を持つメソッドの間には関係がなくconst、完全に異なるものです。構文はこれをかなり明確にします。

于 2012-08-21T10:12:34.820 に答える