2010-04-16

folllow up C++ riddle 2010-3-19

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.


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...

No comments: