可以创建一个通过构造函数参数初始化的匿名对象,例如在下面的return语句中。
struct S {
S(int i_, int j_) : i(i_), j(j_) { }
int i, j;
};
S f()
{
return S(52, 100);
}
int main()
{
cout << f().i << endl;
return 0;
}
但是,是否可以类似地创建一个使用大括号初始化程序初始化的匿名聚合?例如,可以将f()的主体折叠到下面,直到没有“s?”的单个return语句。
struct S {
int i, j;
};
S f()
{
S s = { 52, 100 };
return s;
}
int main()
{
cout << f().i << endl;
return 0;
}
答案 0 :(得分:8)
你不能在当前版本的C ++中。你将能够在C ++ 0x中 - 我相信无论如何。当然,它仍然可以修改 - 有一次我相信你能够在C ++ 0x中指定概念,但那已经消失......
编辑:引用将是N2960中的[dcl.init](§8.5/ 1)。最相关的位是BNF中'braced-init-list'的定义(以及该部分中描述的初始化可以/确实适用于返回值)。
答案 1 :(得分:5)
不在C ++中。但你可以在C99中使用所谓的复合文字:
struct S {
int i, j;
};
struct S F()
{
// Valid C99, invalid C++:
return (struct S){ 52, 100 };
}
[C99:§6.5.2,6.5.2.5]
[C ++ 98:§5.2.3,8.5,12.1,12.2]
某些C ++编译器将其作为扩展提供,但它不是合法的ISO C ++ 98。例如,g ++默认接受此代码,但如果使用-pedantic
选项进行编译,它将拒绝它。
答案 2 :(得分:1)
您将能够在C ++ 1x中的任何地方使用大括号初始化。 (尽管在fnieto的例子中,Comeau 4.3.9 alpha扼杀了。)