我已阅读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数组中的字符。
这是定义的行为吗?
重申:我的问题更具体,这是一个定义的行为,它是标准的一部分,这个行为是不是由标准定义的,这是编译器的非标准实现吗?还有别的吗?