[英]C++ behavior that I don't understand
My friends and I were playing with the C++ language.我和我的朋友们正在玩 C++ 语言。 While doing so, we encountered something we couldn't understand.在这样做的过程中,我们遇到了一些我们无法理解的事情。
Here is the code:这是代码:
#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();
}
}
Output for this code:此代码的输出:
A一种
When I comment out this first line try block and uncomment the second line, which comes to this:当我注释掉第一行 try 块并取消注释第二行时,结果如下:
try
{
// std::vector<char> a = {pcha, pchb};
std::vector<char> a = {pchb, pcha};
print(a);
}
Output becomes:输出变为:
std:exception标准:异常
I thought maybe the this occurs because of the different padding and alignments of the declared variables (char, char*), yet still didn't understand.我想这可能是因为声明的变量(char,char*)的不同填充和对齐方式导致的,但仍然不明白。 You can find the code here to play around.你可以在这里找到代码来玩。 Thanks in advance.提前致谢。
std::vector<char> a = {pcha, pchb};
Here, you use the constructor of vector that accepts two iterators to a range.在这里,您使用 vector 的构造函数,它接受一个范围内的两个迭代器。 Unless the end iterator is reachable from the begin one, the behaviour of the program is undefined.除非结束迭代器可从开始迭代器到达,否则程序的行为是未定义的。 Your two pointers are not iterators to the same range (ie elements of an array), so one is not reachable from the other.您的两个指针不是指向同一范围(即数组的元素)的迭代器,因此无法从另一个指针到达。 Therefore the behaviour of the program is undefined.因此程序的行为是未定义的。
These would be correct:这些是正确的:
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's answer explains your mistake. @eerorika 的回答解释了你的错误。
However, I would like to dissuade you, and other readers, from using the second part of the his(?) corrected code snippet - not because it's incorrect, but because it's problematic coding practice:但是,我想劝阻您和其他读者不要使用他(?)更正代码片段的第二部分 - 不是因为它不正确,而是因为它是有问题的编码实践:
mytype myvar {my_initializer};
).我接受 Nicolai Jossutis 的建议,即尝试使用大括号统一初始化变量并且没有等号(例如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};
or with C++17's template argument deduction:或使用 C++17 的模板参数推导: std::array a {cha, chb};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.