是否创建了对不存在的数组项未定义行为的引用?

zne*_*eak 3 c++ pointers

至少使用我的编译器,创建引用意味着不会解除引用.因此,代码如下所示:

int trivialExample(char* array, int length)
{
    char& ref = array[6];
    if (length > 6)
    {
        std::cout << ref << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,给定一个char数组及其长度(并假设像数组元素这样的一些小数都被初始化并且传递的长度是正确的),它将仅在它实际存在时打印第七个字符.

这是依赖于未定义的行为吗?

rod*_*igo 6

实际上,这在概念上(并且实际上)与以下内容没有区别:

int trivialExample(char* array, int length)
{
    char *ptr = &array[6];
    if (length > 6)
    {
        std::cout << (*ptr) << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有根据的猜测是你打算这样称呼它:

char buffer[4];
trivialExample(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)

在C++中,就像在C中一样,只是获取指向已声明数组外部的指针(除了倒数第二个),即使没有取消引用,也会调用未定义的行为.

理由是,可能有(??)体系结构只是通过在CPU寄存器中加载无效地址而发生故障.

更新:经过一些研究,以及来自其他SO用户的提示,我已经确信C++不允许在声明对象之外引用引用,甚至不允许在倒数第二个元素之外引用.在这种特殊情况下,结果是相同的,除了元素号6,它将在指针版本中允许而不在引用版本中.