0

次のような、C++ の配列へのポインターを返す必要がある関数を実装したいと考えています。

typedef double* ptr;
ptr func(size_t m) {
  return A[m];
}

ここで、Aはグローバルに (または実装クラスのメンバーとして) 定義された 2 次元配列です。

ここで、返された配列が呼び出し元によって変更されないようにしたいと考えています。これを保証するために、関数の戻り値の型をどのように宣言できるか疑問に思っていました。

私はそれを次のように定義しようとしました:

const ptr func(size_t m) {
  return A[m];
}

しかし、私は書くことができます:

ptr x = func(5); 
x[10] = 20.4;

上記は問題なくコンパイルされます。

4

2 に答える 2

3

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

#include <stdlib.h>

static double A[100][100];

const double* func(size_t m) {
      return A[m];
}

int main() {
    double * x = func(5);
    x[10] = 20.4;
}

GCC 4.8.1 レポート:

foo.cc:10:21: error: invalid conversion from ‘const double*’ to ‘double*’ [-fpermissive]
  double * x = func(5);
                     ^

そしてClang 3.3レポート:

foo.cc:10:11: error: cannot initialize a variable of type 'double *' with an rvalue of type 'const double *'
        double * x = func(5);
                 ^   ~~~~~~~

そして、ComicSansMS のコメントを具体化するために、彼が応答しているコメントが削除されたため:

typedef double* ptr;

const ptr func(size_t m) {
    return A[m];
}

このコードは、上記のコードと同じではありません。const ptrdouble への定数ポインターです。元のコードは、定数 double へのポインターを参照します。


次のようにして、これらの行に沿って何かを行うことができます。

typedef double* ptr;
typedef const double* cptr;

cptr func(size_t m) {
    return A[m];
}

int main() {
    ptr x = func(5);
    x[10] = 20.4;
}

エラーを報告するもの:

so.cc:27:6: error: cannot initialize a variable of type 'ptr' (aka 'double *') with an rvalue of type 'cptr' (aka 'const double *')
        ptr x = func(5);
            ^   ~~~~~~~
于 2013-10-09T14:41:02.270 に答える