是标准定义的char引用的std :: cout吗?

时间:2016-02-03 16:45:44

标签: c++ reference char ascii memory-address

我已阅读this post,答案表明以下段落中描述的行为。我不是试图让它在我的机器上工作,或者找到一种解决方法使其在我的机器上工作,这是一个问题,它是根据标准定义的行为。

考虑以下代码,它创建一个int变量,一个int-reference变量,并打印出在int-reference变量上调用address-operator的结果

#include <iostream>

int main() {

    int a = 70;
    int& b = a;

    std::cout << &b << std::endl;

    return 0;
}

打印出我期望的内容,即内存中的地址,即int变量a的地址。

但是现在我将int更改为char,unsigned char或signed char,并且在Xcode(版本6.4)和Visual Studio(VS 2013 Ultimate)上都会出现意外行为。

#include <iostream>

int main() {

    // or unsigned char or signed char, same weird behavior    
    char a = 70; 
    char& b = a; 

    std::cout << &b << std::endl;

    return 0;
}

在Xcode中,控制台打印类似F \ 330 \ 367 \ 277_ \ 377的内容。我知道F是70的ASCII代码,但我不理解其余部分。我假设它也是一组ASCII字符,因为在Visual Studio上它打印出F后跟一些奇怪的字符。

我尝试了其他整数类型,它运行正常。我知道通常char / signed char / unsigned char或它们的某些组合实现为相同的类型。我唯一能想到的是引用类型是作为指针类型实现的,然后将对&amp; b的调用解释为返回指针类型,然后std :: cout将其输入意味着打印出所有char数组中的字符。

这是定义的行为吗?

重申:我的问题更具体,这是一个定义的行为,它是标准的一部分,这个行为是不是由标准定义的,这是编译器的非标准实现吗?还有别的吗?

0 个答案:

没有答案