2

構造体を個別に宣言および初期化できますか?

Ref refType(string strRef) {
    Ref ref;
    if (regex_match(strRef.begin(), strRef.end(), rxIdentifier)) {
        ref = { Var, strRef };
    } else if (regex_match(strRef.begin(), strRef.end(), rxConstant)) {
        ref = { Const, strRef };
    }
    return ref;
}

動作していないようです。{Visual Studioは、構造体の初期化について不平を言います。

4

3 に答える 3

4

はい。ただし、C99 および C++11 のみです。C および C++ の古いバージョンは、このようなものをサポートしていません。

C99 では、これらは複合リテラルと呼ばれ、次のようになります。

typedef struct Point
{
    int x, y;
} Point;
...
Point p;
p = (Point){3, 4};

C++11 では、それらは拡張初期化子リストと呼ばれ、次のようになります。

struct Point
{
    int x, y;
};
...
Point p;
p = {3, 4};

ただし、Evgeny Panasyuk が指摘したように、Visual Studio はまだ C++11 標準に完全に準拠していません。Visual Studio 2010 は、C++11 標準が完成する前にリリースされましたが、当時の標準ドラフトに完全に準拠していませんでした。どうやらVS2012もまだ追いついていないようです。

その結果、Visual Studio はまだ拡張イニシャライザ リストをサポートしていません。Visual Studio も C99 をサポートしておらず、Microsoft は、C99 をすぐにはサポートしないことを示しています。

于 2012-11-01T15:14:09.427 に答える
4

これは C++11 で実行できますが、初期化ではなく代入です。

http://coliru.stacked-crooked.com/a/819b79c4ee428537

#include <iostream>
using namespace std;
struct S
{
   int a;
};
int main()
{
   S b;
   b={1};
   cout << b.a;
   b={2};
   cout << b.a;
   return 0;
}

注、VS2010 および VS2012は初期化子リストをサポートしていません


編集:ところで、コードを次のように変換できます。

Ref refType(string strRef) {
    if (regex_match(strRef.begin(), strRef.end(), rxIdentifier)) {
        Ref ref = { Var, strRef };
        return ref;
    } else if (regex_match(strRef.begin(), strRef.end(), rxConstant)) {
        Ref ref = { Const, strRef };
        return ref;
    }
}

別のアプローチは Boost.Optional を使用することですが、その場合はコンストラクターが必要です。

Ref refType(string strRef)
{
    boost::optional<Ref> ref;
    if(strRef=="1")
    {
        ref=Ref(Var,strRef);
    }
    else
    {
        ref=Ref(Const,strRef);
    }
    return ref.get();
};
于 2012-11-01T15:04:57.103 に答える
1

いいえ、できません。C++ ではRef ref;初期化です。その後の代入は...まあ、代入です。

于 2012-11-01T15:01:21.037 に答える