我有一个非常简单的程序,它只是无限地输出一个指向const volatile char的const指针;它是这样的:
const volatile char* const str = "ABCDEFGHIJKL";
while(true) {
cout << '\r' << str;
}
问题在于,在运行此程序时,输出为1.有一种方法可以解决此问题,即输出const_cast<char*>(str)
而不是str
。
但是如果我做const_cast<volatile char*>(str)
输出是1,就像在演员之前一样,所以我猜测1输出是由volatile
关键字引起的,这很奇怪,因为我认为那是不稳定的只会使编译器避免在该变量中进行优化,这不应该改变它的值。
因此,我的问题是世界是如何将1作为输出的。
注:
我尝试在Ubuntu 16.04中使用GCC进行编译,在Windows 7中使用MinGW进行编译,因此编译器不是问题(我猜)。
答案 0 :(得分:13)
你被Implicit conversion Sequences (ICS)扼杀了。 C ++ std::ostream
工具没有volatile
类型的重载。 ICS启动并选择bool
类型的重载(因为指针类型,无论cv资格如何都可以隐式转换为bool
)。
因此,您会看到1
...将输出更改为std::boolalpha
,您应该看到true
。
示例:
#include <iostream>
#include <iomanip>
int main(){
const volatile char* const str = "ABCDEFGHIJKL";
std::cout << '\r' << str;
std::cout << '\r' << std::boolalpha << str;
}
打印:
1
true