
Hello, David, David Abrahams schrieb:
Daniel Krügler <dsp@bdal.de> writes:
- Assumption one: Boost does not provide the definitions of potential static constants hidden by the BOOST_STATIC_CONSTANT definition (I used only the headers of the library, so my potential testing bug would be that I had to include the corresponding translation units of boost providing the constant's definitions, but sorry - I did not find them!).
[snip]
As I said: If this assumption is false, please blame me straight for incomplete testing and for trying to spread bad rumors on this (really!) great library.
It's probably not false in most cases.
Thanks for this answer, Dave.
- Assumption two: Even if Boost does provide these definitions, there may occur problems due to the VC7.1 flags /Za and /Ze (aka disabling and enabling language extensions), which I will explain in the following. The same point applies as to assumptions one, if I did incomplete testing or testing with rather old boost libraries.
The nasty thing concerning the /Ze flag is that it effectively does not "extend" the language in every case. A small testing case is the following program:
[snip]
Looks like a bug to me.
Then we are two, at least. Thanks for your opinion.
Question: Is this special deficiency of the VC7.1 compiler taken account in the current boost library?
I doubt it. How would we do that?
I don't know. I hope, that there might exist a similar solution as to the wchar_t problem (have a look at the thread "ICC wchar_t proposed solution"), which takes advantage of a compiler macro _WCHAR_T_DEFINED to do the right thing. Whether a similar #define exists for the /Za and /Ze option, I don't know. Is anyone aware of this? A view into the compiler help was not very convincing. The remark "..and automatically defines the __STDC__ predefined macro for C programs" seems not very helpful for C++ programs.
Well, it seems to me that we can only respond to actual problems. Do you have an actual case of using a Boost library where these issues cause you trouble?
A contrived example for the first issue was given in my original posting. I repeat it here again: --------------------------------------------------------------- #include <boost/mpl/vector.hpp> #include <boost/mpl/size.hpp> void foo(const long&) { } int main() { typedef boost::mpl::vector<char, double> MyTypeContainer; typedef boost::mpl::size<MyTypeContainer> MPSizeType; foo(MPSizeType::value); } --------------------------------------------------------------- Switch to /Za, if you use the VC7.1, the mentioned mingw compiler will choke anyway. The second problem would result **iff** boost provides the missing definitions of boost::mpl::size<>::value and similar. In this case the VC7.1 compiler would choke similarily (but fortuneatly not the mingw compiler any longer), if instead of the /Za flag the complimentary /Ze flag is set :-(( Greetings, Daniel