我想我不明白 的初始化std::vector。
下面的代码似乎可以使用 gcc、clang 和 MSVC 编译并正常运行。
#include <iostream>
#include <vector>
int main() {
std::vector<int> v{{}};
v[10] = 11; // if initialize with v{}, segmentation fault.
std::cout << "v[10]:" << v[10] << std::endl; // prints v[10]:11
for (auto e : v) // prints only v[x]:0
std::cout << "v[x]:" << e << std::endl;
}
// result:
// v[10]:11
// v[x]:0
Run Code Online (Sandbox Code Playgroud)
访问元素是否会v[10]导致未定义的行为?
为什么上面的代码用v{{}}可以正常运行,但用 则不行v{}?
编辑)最初我没有使用正确的术语,我的错。当我说“未编译”时,我想说的是“未运行(编译后)”。
std::vector<int> v{};
Run Code Online (Sandbox Code Playgroud)
这初始化v为大小为 的向量0。尝试访问其中的任何元素都会导致未定义的行为。v[10]出界且 UB。
std::vector<int> v{{}};
Run Code Online (Sandbox Code Playgroud)
这初始化v为具有单个元素的向量。该单个元素使用{}ie进行初始化。尝试访问除UB 之外的任何元素。导致UB。int{}0v[0]v[10]