Merge documentation and property change fixes from Trunk.

[SVN r71486]
This commit is contained in:
John Maddock
2011-04-25 17:27:05 +00:00
parent 06dedcd232
commit 7d9fdaee13
2 changed files with 31 additions and 7 deletions

View File

@ -21,15 +21,28 @@ printer friendly PDF format].
[section:intro Overview and Tutorial] [section:intro Overview and Tutorial]
The header `<boost/static_assert.hpp>` supplies a single macro `BOOST_STATIC_ASSERT(x)`, The header `<boost/static_assert.hpp>` supplies two macros:
which generates a compile time error message if the integral-constant-expression `x`
is not true. In other words it is the compile time equivalent of the assert macro; BOOST_STATIC_ASSERT(x)
BOOST_STATIC_ASSERT_MSG(x, msg)
Both generate a compile time error message if the integral-constant-expression `x`
is not true. In other words, they are the compile time equivalent of the assert macro;
this is sometimes known as a "compile-time-assertion", but will be called a this is sometimes known as a "compile-time-assertion", but will be called a
"static assertion" throughout these docs. Note that if the condition is `true`, "static assertion" throughout these docs. Note that if the condition is `true`,
then the macro will generate neither code nor data - and the macro can also then the macros will generate neither code nor data - and the macros can also
be used at either namespace, class or function scope. When used in a template, be used at either namespace, class or function scope. When used in a template,
the static assertion will be evaluated at the time the template is instantiated; the static assertion will be evaluated at the time the template is instantiated;
this is particularly useful for validating template parameters. this is particularly useful for validating template parameters.
If the C++0x `static_assert` feature is available, both macros will use it.
For `BOOST_STATIC_ASSERT(x)`, the error message with be a stringized version of `x`.
For `BOOST_STATIC_ASSERT_MSG(x, msg)`, the error message will be the `msg` string.
If the C++0x `static_assert` feature is not available, `BOOST_STATIC_ASSERT_MSG(x, msg)`
will be treated as `BOOST_STATIC_ASSERT(x)`.
The material that follows assumes the C++0x `static_assert` feature is not available.
One of the aims of `BOOST_STATIC_ASSERT` is to generate readable error messages. One of the aims of `BOOST_STATIC_ASSERT` is to generate readable error messages.
These immediately tell the user that a library is being used in a manner that These immediately tell the user that a library is being used in a manner that

View File

@ -16,12 +16,16 @@
// Namespace scope // Namespace scope
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short)); BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
BOOST_STATIC_ASSERT(sizeof(char) == 1); BOOST_STATIC_ASSERT(sizeof(char) == 1);
BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg1");
BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg2");
// Function (block) scope // Function (block) scope
void f() void f()
{ {
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short)); BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
BOOST_STATIC_ASSERT(sizeof(char) == 1); BOOST_STATIC_ASSERT(sizeof(char) == 1);
BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg3");
BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg4");
} }
struct Bob struct Bob
@ -29,6 +33,8 @@ struct Bob
private: // can be in private, to avoid namespace pollution private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short)); BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
BOOST_STATIC_ASSERT(sizeof(char) == 1); BOOST_STATIC_ASSERT(sizeof(char) == 1);
BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg5");
BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg6");
public: public:
// Member function scope: provides access to member variables // Member function scope: provides access to member variables
@ -36,9 +42,11 @@ struct Bob
char c; char c;
int f() int f()
{ {
#ifndef _MSC_VER // broken sizeof in VC6 #if defined(_MSC_VER) && _MSC_VER < 1300 // broken sizeof in VC6
BOOST_STATIC_ASSERT(sizeof(x) >= sizeof(short)); BOOST_STATIC_ASSERT(sizeof(x) >= sizeof(short));
BOOST_STATIC_ASSERT(sizeof(c) == 1); BOOST_STATIC_ASSERT(sizeof(c) == 1);
BOOST_STATIC_ASSERT_MSG(sizeof(x) >= sizeof(short), "msg7");
BOOST_STATIC_ASSERT_MSG(sizeof(c) == 1, "msg8");
#endif #endif
return x; return x;
} }
@ -52,6 +60,7 @@ struct Bill
{ {
private: // can be in private, to avoid namespace pollution private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(Int) > sizeof(char)); BOOST_STATIC_ASSERT(sizeof(Int) > sizeof(char));
BOOST_STATIC_ASSERT_MSG(sizeof(Int) > sizeof(char), "msg9");
public: public:
// Template member function scope: provides access to member variables // Template member function scope: provides access to member variables
@ -62,10 +71,12 @@ struct Bill
{ {
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2)); BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2)); BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
BOOST_STATIC_ASSERT_MSG(sizeof(Int) == sizeof(Int2), "msg10");
BOOST_STATIC_ASSERT_MSG(sizeof(Char) == sizeof(Char2), "msg11");
} }
}; };
void test_Bill() // BOOST_CT_ASSERTs are not triggerred until instantiated void test_Bill() // BOOST_STATIC_ASSERTs are not triggerred until instantiated
{ {
Bill<int, char> z; Bill<int, char> z;
//Bill<int, int> bad; // will not compile //Bill<int, int> bad; // will not compile