我可以单独声明和初始化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抱怨{
初始化结构。
答案 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;
是初始化,后续作业是......好吧,作业。