初始化具有大小的类成员向量失败

use*_*143 3 c++ class vector visual-studio

我是c ++的新手,遇到了这个问题.这是我的代码:

class A
{
    std::vector <int> vec(10);
};
Run Code Online (Sandbox Code Playgroud)

它给了我错误的说法expected a type specifier.我知道这种初始化向量的方式是不可接受的,它应该在构造函数中完成,但我很好奇为什么会失败.我也注意到了这个:

class A
{
    std::vector <int> vec = std::vector<int>(10);
};
Run Code Online (Sandbox Code Playgroud)

工作得很好.

所以我的问题是为什么第二种情况仍然有效,即使我们仍然使用"预定义大小"(std::vector<int>(10))创建向量,为什么第一种情况会失败?谢谢.

PS 我正在尝试创建大小为10个整数的向量,而不是创建一个10已插入其中的向量.

Lig*_*ica 7

什么?

从C++ 11开始,我们拥有非静态数据成员初始化程序,这使得初始化成员的方法完全有效.但是,您必须使用={}.

形式上,如果此处存在初始值设定项,则必须使用括号或等于初始化程序语法生成.

由于您使用的语法在此处不计入初始化,因此编译器会尝试从中进行函数声明vec,因为20它不是类型而中断.


为什么?

原始功能提案(N2756)中名为"问题1"的章节解释了()此处不允许这样做以避免对成员函数声明产生一些混淆.

作者确实在其中注意到委员会可以让它成为,并使其像其他声明一样工作 - 也就是说,它是一个功能,如果它可以,而另一个对象*.但作者决定采用不同的方向,只是禁止语法以避免在这种特殊情况下出现问题.

不幸的是,这使得"(表达式列表)"的初始化形式在解析声明时不明确 [...]

一种可能的解决方案是依赖现有规则,如果声明可以是对象或函数,那么它是一个函数 [...]

一个类似的解决方案是应用另一个现有的规则,目前只在模板中使用,如果T可能是一个类型或其他东西,那么它是其他的东西; 我们可以使用" typename"如果我们真的是一种类型[..]

这两种解决方案都引入了很多可能被许多用户误解的细微差别(comp.lang.c ++上的许多问题都证明了int i();"块大小的原因" 并未声明默认初始化int).

本文提出的解决方案是仅允许"= initializer-clause "和"{ initializer-list }"形式的初始化器.这解决了大多数情况下的歧义问题.

这就是人生.


所以?

我正在尝试创建大小为10个整数的向量,而不是创建一个已插入10的向量.

这是一个重点.要小心,因为初始化矢量{} 不会那样做.不幸的是, "统一"初始化只是增加了更多含义.这么多解决歧义问题......

因此,您应该使用=语法,或者只在构造函数(我最喜欢的)中执行此操作.


*这是最令人烦恼的解析有时会咬你的地方,尽管并非每次出现的意外函数声明都是最令人烦恼的解析的例子.