为什么统一初始化语法仅适用于对象?

时间:2013-06-11 13:34:58

标签: c++ c++11 uniform-initialization

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

1 个答案:

答案 0 :(得分:0)

C ++的初始化规则非常复杂。它们在标准章节(第8节)的后半部分进行了描述。零初始化,直接初始化,值初始化,复制初始化,列表初始化仅举几例,每个都可以根据上下文(声明,参数,返回,抛出,成员初始化器等)进行不同的交互。 ),要绑定的类型的属性和输入初始化表达式或braced-init-list。语言设计者还将目标与C和旧版本的C ++几乎向后兼容,这限制了他们可以做的事情。需要进行一些研究来推测初始化规则更改的后果,并且更改可能会产生许多意外的极端情况。如果您有兴趣,我鼓励您学习标准,并尝试解决您所设计的改变的影响。