gpt4 book ai didi

c++ - 为什么 std::cout 将 volatile 指针转换为 bool?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:21 24 4
gpt4 key购买 nike

如果您尝试 cout 一个指向 volatile 类型的指针,即使是您通常希望 cout 打印字符串的 volatile char 指针,您也只会得到 '1'(我认为假设指针不为 null)。我假设输出流 operator<< 是专门用于 volatile 指针的模板,但我的问题是,为什么?什么用例激发了这种行为?

示例代码:

#include <iostream>
#include <cstring>

int main()
{
char x[500];
std::strcpy(x, "Hello world");

int y;
int *z = &y;

std::cout << x << std::endl;
std::cout << (char volatile*)x << std::endl;

std::cout << z << std::endl;
std::cout << (int volatile*)z << std::endl;

return 0;
}

输出:

Hello world
1
0x8046b6c
1

最佳答案

ostream::operator<<具有以下重载,其中包括:

ostream& operator<< (bool val );
ostream& operator<< (const void* val );

当您传入一个 volatile 指针时,第二个重载无法应用,因为如果没有显式转换,volatile 指针无法转换为非 volatile。但是,任何指针都可以转换为 bool,因此选择第一个重载,您看到的结果是 1 或 0。

因此,真正的原因不是代表标准委员会有意做出的决定,而只是标准没有指定采用 volatile 指针的重载。

关于c++ - 为什么 std::cout 将 volatile 指针转换为 bool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54866083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com