【发布时间】:2014-10-22 13:16:40
【问题描述】:
C++ 草案标准 (N3337) 有以下关于指针转换的内容:
4.10 指针转换
2 “pointer to cv
T”类型的右值,其中T是对象类型,可以转换为“pointer to cv”类型的右值em>void。”将“指向 cvT的指针”转换为“指向 cvvoid的指针”的结果指向类型对象的存储位置的开始T驻留,就好像该对象是T类型的最派生对象 (1.8)(即,不是基类子对象)。
和
4.12 布尔转换
1 算术、枚举、指针或指向成员类型的指针的右值可以转换为
bool类型的右值。将零值、空指针值或空成员指针值转换为 false;任何其他值都转换为 true
基于上述,将函数指针或指向int的指针转换为void*以及bool是完全可以的。
但是,如果可以选择两者,指针应该转换为哪一个?
然后,为什么指向函数的指针会转换为bool,而指向int 的指针会转换为void*?
程序:
#include <iostream>
using namespace std;
void foo(const void* ptr)
{
std::cout << "In foo(void*)" << std::endl;
}
void foo(bool b)
{
std::cout << "In foo(bool)" << std::endl;
}
void bar()
{
}
int main()
{
int i = 0;
foo(&bar);
foo(&i);
return 0;
}
输出,使用 g++ 4.7.3:
在 foo(bool) 在 foo(void*)【问题讨论】:
-
任何指向 object 的指针都可以转换为
void*并返回。例如,函数指针可能具有完全不同的大小,因此转换不是(保证是)有效的。但是您确实希望能够检查它是否为空。 (请注意,POSIX 确实要求您可以将函数指针转换为void*/从void*)。 -
指向指针的指针不能转换为 void* 在我看来这很愚蠢,因为它应该是指向任何东西(这是一种数据类型)的指针,而指针是一种数据类型。不过,这是一个单独的问题。
-
@CashCow 指向指针的指针可以转换为void*。
-
@CashCow,也许您的意思是转换为
void **。那个是不允许的。 -
这不是我的问题的重复。我的问题是关于 iostreams 和它提供的
operator<<的重载,而不是关于隐式转换规则。