在c ++ 11中,我们为对象提供了很好的统一初始化语法。为什么它不扩展到初始化非对象类型?
这有什么语法歧义,还是我问的一些愚蠢的问题?
示例:
struct s{ int k;};
s s1{1}; //ok (object initialization)
s const& s3{3}; //ok (object initialization)
s& s2{s1}; //error (reference initialization)
一个更有用的例子:
struct t{ t(t const& x) : k(x.k){} int k;};
struct c
{
c(t& x1,t& x2)
: s1_{x1} //error (reference initialization)
, s2_{x2} //ok (object initialization)
{}
t& s1_;
t s2_;
};
另一个:
template<class T>
T get()
{
return T{};
}
//ok (object initialization)
get<int>();
//error (void initialization? I do not know terminology for void() token equivalent)
get<void>();
答案 0 :(得分:0)
C ++的初始化规则非常复杂。它们在标准章节(第8节)的后半部分进行了描述。零初始化,直接初始化,值初始化,复制初始化,列表初始化仅举几例,每个都可以根据上下文(声明,参数,返回,抛出,成员初始化器等)进行不同的交互。 ),要绑定的类型的属性和输入初始化表达式或braced-init-list。语言设计者还将目标与C和旧版本的C ++几乎向后兼容,这限制了他们可以做的事情。需要进行一些研究来推测初始化规则更改的后果,并且更改可能会产生许多意外的极端情况。如果您有兴趣,我鼓励您学习标准,并尝试解决您所设计的改变的影响。