const volatile char字符串打印不正确

时间:2017-06-28 21:20:39

标签: c++ string volatile

我有一个非常简单的程序,它只是无限地输出一个指向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进行编译,因此编译器不是问题(我猜)。

1 个答案:

答案 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

Demo