这些向量定义"constant initialization"吗?
Are these vector definitions "constant initialization"?
这个问题是关于代码(在命名空间范围内):
std::vector<int> v1;
std::vector<int> v2(4);
在C++14(N4140)的第3.6.2节中,定义了一个术语常量初始化:
执行恒定初始化:
- [省略-关于引用初始化]
- 如果具有静态或线程存储持续时间的对象是由构造函数调用初始化的,并且如果初始化完整表达式是该对象的常量初始化器
- 如果具有静态或线程存储持续时间的对象未由构造函数调用初始化,并且该对象是值初始化的,或者其初始化器中出现的每个完整表达式都是常量表达式
此外,术语常量初始值设定项是在前面定义的:
对象
o
的常量初始值设定项是一个表达式常量表达式,只是它也可以调用o
及其子对象的constexpr构造函数,即使这些对象是非文字类类型的。
所以,看看std::vector<int> v2(4)
。
这个对象是由构造函数调用初始化的,所以它被第二个要点覆盖。初始化完整表达式为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
都使用)涉及构造函数调用。
因此,构造函数调用是您引用的第二个项目符号的"初始化完整表达式"的一部分。因此,构造函数调用,而不仅仅是4
,是完整的表达式。这反过来意味着这样一个构造函数必须是constexpr
才能符合常量初始值设定项的条件(如您所引用的,根据其定义)。由于std::vector
的默认构造函数和size_t
构造函数都不是constexpr
,因此初始化不是恒定的。
- C++如何通过"constructor initialization"初始化行变量?
- C++ CRTP initialization
- 如何处理Boost Spirit X3导致Visual Studio 2019 "static initialization order fiasco"?
- 'initialization'到底是什么意思?
- Qt 错误消息"qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed"
- 为什么"an inherited constructor is not a candidate for initialization from an expression of the same or
- "static initialization order fiasco"是 constexpr 变量的问题吗?
- 'default-initialization in copy-initialization context'在C++中是什么意思?
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- 如何避免"invalid initialization of reference" C++中琐碎函子的错误
- C++ Zero-Initialization
- JNI 失败并显示'Error occurred during initialization of VM'
- 为什么 clang++ 报告与 "value stored to '...' during its initialization is never read" 的结构化绑定?
- 添加新对话框后,MFC 应用程序启动失败并"DLL Initialization Failed"
- std::initializer_list构造函数和"braced initialization"的问题
- 为什么在列表initialization函数参数时,显式构造函数不匹配
- 来自 C# 的 gcc DLL:Windows 10 上的"DLL initialization routine failed"
- CUDA : 错误: 创建推力时"transfer of control bypasses initialization of"::d evice_ptr
- C++, "Error: initialization with '{...}' expected for aggregate object"
- GL_INVALID_ENUM right after context initialization