这个问题是关于代码(在命名空间范围):
std::vectorv1; std::vector v2(4);
在C++ 14(N4140)的3.6.2节中,定义了一个术语常量初始化:
执行常量初始化:
[省略 - 关于参考初始化]
如果具有静态或线程存储持续时间的对象由构造函数调用初始化,并且初始化full-expression是对象的常量初始值设定项;
如果具有静态或线程存储持续时间的对象未通过构造函数调用初始化,并且该对象是值初始化的,或者其初始化程序中出现的每个完整表达式都是常量表达式.
此外,术语常量初始化器在前面定义:
甲恒定初始化的对象
o
是一个常量表达式,不同之处在于它还可以调用用于constexpr构造的表达o
和它的子对象,即使这些对象是非文字类类型.
所以,看着std::vector
.
该对象由构造函数调用初始化,因此它被第二个项目符号点覆盖.初始化全表达式是4
. 4
是一个常量表达式,因此它是一个常量初始化器.因此满足第二个要点,这应该是不断初始化的情况.
但是,我测试了几个编译器,所有这些似乎都被v2
视为动态初始化.
对于这种v1
情况,目前尚不清楚这是否算作"由构造函数调用初始化"; 如果是这样,初始化完整表达式将是什么.
我的问题是:是v1
和v2
常量初始化,还是动态初始化 ; 如果是后者,是否可以解释这些标准中的引用是如何解释的?
根据1.9/10,初始化的完整表达包括对构造函数的调用:
甲全表达为不是另一种表达的子表达式的表达式....如果定义语言构造以产生函数的隐式调用,则语言构造的使用被认为是用于该定义的表达式....为了满足表达式出现的语言结构的要求,应用于表达式结果的转换也被认为是完整表达式的一部分.
[ 例子:
......S s1(1); // full-expression is call of S::S(int)
然后,每8.5/17,直接初始化(两者v1
和v2
使用)包括一个构造函数调用.
因此,构造函数调用是您引用的第2个项目符号点的"初始化完整表达式"的一部分.所以构造函数调用,而不仅仅是4
,是完整表达式.这反过来意味着这样的构造函数必须constexpr
符合常量初始化程序(按照你的定义,如你所引用的那样).既然默认构造函数也不size_t
构造函数std::vector
都是constexpr
,则初始化不是常量.