单独声明和初始化struct?

时间:2012-11-01 14:59:56

标签: c++ visual-c++

我可以单独声明和初始化struct吗?

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抱怨{初始化结构。

3 个答案:

答案 0 :(得分: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 do not support initializer lists


编辑:顺便说一下,您可以将代码转换为:

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();
};

答案 1 :(得分: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,微软表示他们不打算很快支持C99。

答案 2 :(得分:1)

不,你不能,在C ++中Ref ref;是初始化,后续作业是......好吧,作业。