我不明白的 C++ 行为

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*)的不同填充和对齐方式导致的,但仍然不明白。你可以在这里找到代码来玩。提前致谢。

eer*_*ika 6

std::vector<char> a = {pcha, pchb};
Run Code Online (Sandbox Code Playgroud)

在这里,您使用 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)