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

您可以在 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 回答
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。

于 2012-11-01T15:14:09.427 回答
1

不,你不能,在 C++Ref ref;中是初始化,随后的分配是......好吧,分配。

于 2012-11-01T15:01:21.037 回答