This is a follow up of the 3-19's C++ riddle.
Note: this article assumes the reader has some knowledge about C++ language.
There was a question about the last C++ riddle: Is this standard defined behaviour or depending on the environment? The last blog, I am a bit uncertain on the pitfall 4,
Pitfall 4. This pointer is implicitly converted to boolean type.
this is standard or not. So, I tried gcc4, icc9, and VisualStudio2008. If it is not a compiler bug, this is environment dependent.
VisualStudio2008 casts a linker error. icc9 and gcc4 output warning if -Wall is specified, but both created an executable and output is 1.
Personally, the easiest behavior among three is VisualStudio2008. A function pointer's type depends on function arguments. This prevents specialization since we don't know what function will be written in the future. Then if we use void*, I believe that is not a good idea since
there is no meaning to use template in such a case.
Under this circumstances, I think the compiler writers can choose: 1. using implicit conversion from pointer to bool, 2. casts an error. Thanks to Peter.
Anyway, my point is C++ is difficult...
Note: this article assumes the reader has some knowledge about C++ language.
There was a question about the last C++ riddle: Is this standard defined behaviour or depending on the environment? The last blog, I am a bit uncertain on the pitfall 4,
Pitfall 4. This pointer is implicitly converted to boolean type.
this is standard or not. So, I tried gcc4, icc9, and VisualStudio2008. If it is not a compiler bug, this is environment dependent.
Visual Studio 2008
a.obj : error LNK2019: unresolved external symbol "class std::basic_string>char, struct="" char_traits=""<>char<<,class std::allocator>char < __cdecl middle(void)" (?middle@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) refer
enced in function _main
a.exe : fatal error LNK1120: 1 unresolved externals
---
icc9
a.cc(6): remark #1419: external declaration in primary source file
std::string middle();
---
gcc4
a.cc: In function `int main()':
a.cc:6: warning: the address of `std::string middle()', will always evaluate as `true'
VisualStudio2008 casts a linker error. icc9 and gcc4 output warning if -Wall is specified, but both created an executable and output is 1.
Personally, the easiest behavior among three is VisualStudio2008. A function pointer's type depends on function arguments. This prevents specialization since we don't know what function will be written in the future. Then if we use void*, I believe that is not a good idea since
there is no meaning to use template in such a case.
Under this circumstances, I think the compiler writers can choose: 1. using implicit conversion from pointer to bool, 2. casts an error. Thanks to Peter.
Anyway, my point is C++ is difficult...
Comments