这是我对why is elapsedtime giving me an output of 1?
的回答的延续我能够使用g ++ 4.7.3成功编译和构建以下程序。
#include <iostream>
using namespace std;
int elapsedtime(int time1, int time2)
{
return (time2-time1);
}
int main()
{
int time1;
int time2;
cin >> time1 >> time2;
cout << "Your elapsed time is " << elapsedtime <<endl;
}
main
中最后一行的意图是:
cout << "Your elapsed time is " << elapsedtime(time1, time2) <<endl;
g ++如何能够无错误地编译第一个版本?
答案 0 :(得分:4)
如果有适当的警告级别,GCC会发出警告:
test.cpp|14 col 39| warning: the address of 'int elapsedtime(int, int)' will always evaluate as 'true' [-Waddress]
答案 1 :(得分:3)
因为它是完全有效的C ++。
函数名称可以隐式转换为指向该函数的指针。
对于MSVC,标准库为任意指针提供输出操作符,用于打印该指针的数值。
对于GCC / Clang,结果有点复杂:它们(正确地)没有实现与函数指针匹配的插入器。而是将函数指针隐式转换为bool,其为true(1),因为指针不为null。转换序列也可以像这样明确写出。
int(*p)(int, int) = elapsedtime;
bool b = p;
cout << "Your elapsed time is " << b <<endl;
请注意,使用适当的警告级别,当隐式转换序列导致函数名称被评估为true
时,g ++和clang都会发出警告,警告类似于:
warning: address of function 'elapsedtime' will always evaluate to 'true' [-Wbool-conversion]
答案 2 :(得分:2)
std::ostream
有operator << (bool)
,函数名在标准下可以隐式转换为bool
(通过函数到指针的转换,然后是布尔转换)。相关语言为(§4[conv] / p1,§4.3[conv.func],§4.12[conv.bool]):
标准转换序列是一系列标准转换 按以下顺序:
- 来自以下集合的零或一次转换:左值到右值的转换,数组到指针的转换以及函数到指针的转换。
- 来自以下设置的零次或一次转换:整数促销,浮点促销,整数转换,浮点转换,浮点积分转换,指针转换,指向成员转换的指针以及布尔转换。
- 零或一个资格转换。
函数类型T的左值可以转换为类型的prvalue “指向T的指针”结果是指向函数的指针。
算术,无范围枚举,指针或指针的prvalue 成员类型可以转换为
bool
类型的prvalue。零 转换value,null指针值或null成员指针值 到false
;任何其他值都将转换为true
。