我和我的朋友们都在使用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();
}
}
此代码的输出:
A
当我注释掉第一行时,尝试阻止并取消注释第二行,这涉及到此:
try
{
// std::vector<char> a = {pcha, pchb};
std::vector<char> a = {pchb, pcha};
print(a);
}
输出变为:
std:exception
我以为这可能是由于声明的变量(char,char *)的填充和对齐方式不同而引起的,但仍然不了解。您可以找到代码here来播放。预先感谢。
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
@@ eerorika的答案解释了您的错误。
但是,我想劝阻您和其他读者不要使用his(?)更正后的代码片段的第二部分-不是因为它不正确,而是因为它是有问题的编码实践:
mytype myvar {my_initializer};
。]char arr[] {cha, chb};
std::vector<char> a = {std::begin(arr), std::end(arr)};
std::vector<char> a {cha, chb};
std::array<char, 2> a {cha, chb};
或使用C ++ 17的模板参数推导:std::array a {cha, chb};