22

次のように、配列を使用して名前付き変数を作成できます。

char s[] = {1, 2, 3, 0};
if (strcmp(s, t))
    ...

ただし、次は機能しません。

if (strcmp(char[]{1,2,3,0}, t))
    ...

初期化子リストで名前のない一時的な配列を指定する方法はありますか? (この場合、文字列リテラルは機能しますが、char 配列以外の配列の場合は?)

アップデート:

#include <iostream>
#include <cstring>

using namespace std;

typedef char CA[];

int main()
{
        cout << CA{1,2,3, 0} << endl;
}

error: taking address of temporary array( g++-4.7.2 -std=gnu++11)を与える

更新 2:

私は(おそらく)起こっていることは、文字列リテラルが lvalues として特別に祝福されていることだと思いますが一時的な配列はprvaluesであるため、アドレスを取得できません。これは勝手な推測ですが、よくわかりません。

更新 3:

実際、それは間違っているはずです:

「NT の配列」または「T の境界が不明な配列」型の左辺値または右辺値は、「T へのポインタ」型の prvalue に変換できます。結果は、配列の最初の要素へのポインターです。

4

3 に答える 3

6

はい、typedefを使用してから言ってください

ArrayType{1, 2, 3, 0}

または、エイリアス テンプレートを使用してから、

AliasTemplate<char[]>{1, 2, 3, 0}
于 2013-03-17T08:26:42.973 に答える
4

この問題はC++11の「move」を使えば解決できるようです。g++ 4.8.1 でプログラムをコンパイルします。

#include <iostream>
#include <cstring>
using namespace std;

typedef char CA[];
int main() {
  cout << CA{'a','b','c',0} << endl;
}

「エラー:一時配列のアドレスを取得しています」という結果になります。ただし、「移動」を使用すると:

cout << move(CA{'a','b','c',0}) << endl;

プログラムは正しくコンパイルおよび実行されます。C++11 の方言を使用するには、コンパイラを呼び出す必要があります。

g++ prog1.cpp -o prog.exe -std=c++11

同様に、

#include <iostream>
#include <cstring>
using namespace std;
int main()
{ char t[]={1,2,3,0};
  if (strcmp( move((char[]){1,2,3,0}) ,t)==0)  //OK
    cout << "equal\n";
  else 
    cout << "different\n";
}

-std=c++11 フラグを使用すると、正しくコンパイルおよび実行されます。

于 2014-11-06T18:06:01.197 に答える