drh*_*use 0 c++ vector type-conversion implicit-conversion c++17
我和我的朋友们正在玩 C++ 语言。在这样做的过程中,我们遇到了一些我们无法理解的事情。
这是代码:
#include <vector>
#include <iostream>
void print(std::vector<char> const &input)
{
std::cout << input.size();
for (int i = 0; i < input.size(); i++)
{
std::cout << input.at(i) << " - ";
}
}
int main()
{
char cha = 'A';
char chb = 'B';
char * pcha = &cha;
char * pchb = &chb;
try
{
std::vector<char> a = {pcha, pchb};
//std::vector<char> a = {pchb, pcha};
print(a);
}
catch(std::exception e)
{
std::cout << e.what();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码的输出:
一种
当我注释掉第一行 try 块并取消注释第二行时,结果如下:
try
{
// std::vector<char> a = {pcha, pchb};
std::vector<char> a = {pchb, pcha};
print(a);
}
Run Code Online (Sandbox Code Playgroud)
输出变为:
标准:异常
我想这可能是因为声明的变量(char,char*)的不同填充和对齐方式导致的,但仍然不明白。你可以在这里找到代码来玩。提前致谢。
Run Code Online (Sandbox Code Playgroud)std::vector<char> a = {pcha, pchb};
在这里,您使用 vector 的构造函数,它接受一个范围内的两个迭代器。除非结束迭代器可从开始迭代器到达,否则程序的行为是未定义的。您的两个指针不是指向同一范围(即数组的元素)的迭代器,因此无法从另一个指针到达。因此程序的行为是未定义的。
这些是正确的:
std::vector<char> a = {cha, chb}; // uses initializer_list constructor
// or
char arr[] {cha, chb};
char * pcha = std::begin(arr);
char * pchb = std::end(arr);
std::vector<char> a = {pcha, pchb}; // uses the iterator constructor
Run Code Online (Sandbox Code Playgroud)