C++ 将volatile c-string与std::cout一起使用

C++ 将volatile c-string与std::cout一起使用,c++,std,volatile,ostream,C++,Std,Volatile,Ostream,我有以下代码 #include <iostream> #include <cstdio> volatile char s[7] = "test"; int main() { std::cout << s << std::endl; std::printf("%s\n", s); } 它用std::cout打印1,用std::printf测试。为什么第一个案例会打印1?!我的系统是Linux Debian 4.93-3-AMD64 1

我有以下代码

#include <iostream>
#include <cstdio>
volatile char s[7] = "test";
int main() {
   std::cout << s << std::endl;
   std::printf("%s\n", s);
}
它用std::cout打印1,用std::printf测试。为什么第一个案例会打印1?!我的系统是Linux Debian 4.93-3-AMD64 1 SMP Debian 4.930-2 +De9U5 2017 0919 X86Y64 GNU/Linux,我的C++编译器是G+GCC 7.3.0.
如果我删除volatile关键字,那么std::cout将打印预期的测试。

printf是可变的,因此可以使用任何类型的参数。CUT是更强类型的C++ THGIGIE。char const volatile*不会隐式转换为char const*。但它会变成布尔。因此,1.

这可以被认为是标准库中的bug吗?我不会称之为bug。但这肯定是出乎意料的行为。就像在Windows中尝试通过cout输出宽字符串,或通过wcout输出窄非ASCII字符串一样。我认为标准库应该为char*和void*的易失性版本提供重载。我不完全确定,如果字符串的字符也意味着其长度在打印时可以更改,那么该字符串的预期输出是什么?更一般地说,几乎每个库中的常见模式都是忽略易失性指针;如果指向的对象足够稳定,可以对其执行某些操作,则调用方可以通过丢弃volatile来确认。我怀疑将volatile char*与%s一起使用是未定义的行为。