gpt4 book ai didi

c++ - 如果使用 g++,为什么 std::cout 可以转换为 void*?

转载 作者:IT老高 更新时间:2023-10-28 22:58:52 25 4
gpt4 key购买 nike

为什么可以将 std::ostream 转换为 void 指针?我不知道 std::ostream 中有任何此类转换运算符。代码如下

#include <iostream>

int main()
{
void *p = std::cout; // why does this work?
}

我问这个问题是因为我看到一个放置操作符 new 被调用为

Foo* pFoo = new (std::cerr) Foo;

完全不知道为什么要写这样的东西。

PS:我正在使用 g++ 4.9.2 进行编译,无论是否使用 -std=c++11。 clang++ 不接受代码

PSS:发现由于所谓的“安全 bool 问题”(参见@nicebyte 的回答),在 C++11 之前,为 std 定义了一个 void* 转换运算符::ostream,然后在 C++11 中被删除。但是,我的代码使用 g++ 在 C++11 中编译得很好。不仅如此,无论我使用什么版本的标准,即使使用 -std=c++98,clang++ 都会拒绝它,尽管我的理解是,如果编译为 pre-C++,它应该接受11.

最佳答案

阅读 this (您的问题已在最后一节“安全 bool 问题”中得到解答)。

为了详细说明,实现定义了对 void* 的隐式转换,为 std::cinstd::cout 等定义>,这样就可以编译像 while(std::cin>>x){...} 这样的代码,而像 int x = std::cin; 这样的代码不会不。它仍然存在问题,因为您可以编写示例中的内容。

C++11 通过引入显式转换解决了这个问题。

显式转换运算符如下所示:

struct A {
explicit operator B() { ... } // explicit conversion to B
};

当 A 显式转换为 B 时,这样的代码就变得合法了:

A a;
B b(a);

但是,这样的代码不是:

A a;
B b = a;

if(std::cin) 这样的结构需要将 cin 转换为 bool,标准规定为了转换在特定情况下有效,像 bool x(std::cin); 这样的代码应该是“合法的”。这可以通过向 bool 添加显式转换来实现。它允许在上述上下文中使用 cin/cout,同时避免像 int x = std::cout;.

这样的事情

有关详细信息,请参阅 Bjarne's page以及 this question .

关于c++ - 如果使用 g++,为什么 std::cout 可以转换为 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28060250/

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