2
0
mirror of https://github.com/boostorg/config.git synced 2026-01-19 04:02:17 +00:00

Rebuild html docs.

This commit is contained in:
Andrey Semashev
2025-12-13 02:40:11 +03:00
parent f14b2a48d2
commit 6d997d79f9
9 changed files with 590 additions and 13 deletions

View File

@@ -3,7 +3,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Acknowledgements</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="rationale.html" title="Rationale">

View File

@@ -3,11 +3,11 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Boost Macro Reference</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="../index.html" title="Boost.Config">
<link rel="next" href="build_config.html" title="Build Time Configuration">
<link rel="next" href="static_assert.html" title="Compile-time assertions">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
@@ -21,7 +21,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="build_config.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="static_assert.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -4224,6 +4224,19 @@
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">BOOST_NO_CXX17_AUTO_NONTYPE_TEMPLATE_PARAMS</span></code>
</p>
</td>
<td>
<p>
The compiler does not support <code class="computeroutput"><span class="keyword">auto</span></code>
non-type template parameters.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
@@ -7321,7 +7334,7 @@
</div>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="build_config.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="../index.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="static_assert.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -3,10 +3,10 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Build Time Configuration</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="boost_macro_reference.html" title="Boost Macro Reference">
<link rel="prev" href="static_assert.html" title="Compile-time assertions">
<link rel="next" href="cstdint.html" title="Standard Integer Types">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
@@ -21,7 +21,7 @@
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_macro_reference.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="cstdint.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="static_assert.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="cstdint.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
@@ -167,7 +167,7 @@
</div>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_macro_reference.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="cstdint.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
<a accesskey="p" href="static_assert.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="cstdint.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -3,7 +3,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Standard Integer Types</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="build_config.html" title="Build Time Configuration">

View File

@@ -3,7 +3,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Guidelines for Boost Authors</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="cstdint.html" title="Standard Integer Types">

View File

@@ -3,7 +3,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Rationale</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="guidelines_for_boost_authors.html" title="Guidelines for Boost Authors">

View File

@@ -0,0 +1,555 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Compile-time assertions</title>
<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="../index.html" title="Boost.Config">
<link rel="up" href="../index.html" title="Boost.Config">
<link rel="prev" href="boost_macro_reference.html" title="Boost Macro Reference">
<link rel="next" href="build_config.html" title="Build Time Configuration">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
<td align="center"><a href="../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_macro_reference.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="build_config.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="boost_config.static_assert"></a><a class="link" href="static_assert.html" title="Compile-time assertions">Compile-time assertions</a>
</h2></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.intro">Overview and Tutorial</a></span></dt>
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.how">How it works</a></span></dt>
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.test">Test Programs</a></span></dt>
</dl></div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_config.static_assert.intro"></a><a class="link" href="static_assert.html#boost_config.static_assert.intro" title="Overview and Tutorial">Overview and Tutorial</a>
</h3></div></div></div>
<div class="toc"><dl class="toc">
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.intro.namespace">Use at
namespace scope</a></span></dt>
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.intro.function">Use at function
scope</a></span></dt>
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.intro.class">Use at class
scope</a></span></dt>
<dt><span class="section"><a href="static_assert.html#boost_config.static_assert.intro.templates">Use in
templates</a></span></dt>
</dl></div>
<p>
The header <code class="computeroutput"><span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="keyword">static_assert</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span></code>
supplies two macros:
</p>
<pre class="programlisting"><span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span>
<span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span> <span class="identifier">msg</span><span class="special">)</span>
</pre>
<p>
Both generate a compile time error message if the integral-constant-expression
<code class="computeroutput"><span class="identifier">x</span></code> 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 "static
assertion" throughout these docs. Note that if the condition is <code class="computeroutput"><span class="keyword">true</span></code>, 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, the static assertion will be
evaluated at the time the template is instantiated; this is particularly
useful for validating template parameters.
</p>
<p>
If the C++0x <code class="computeroutput"><span class="keyword">static_assert</span></code> feature
is available, both macros will use it. For <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>,
the error message will be a stringized version of <code class="computeroutput"><span class="identifier">x</span></code>.
For <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span>
<span class="identifier">msg</span><span class="special">)</span></code>,
the error message will be the <code class="computeroutput"><span class="identifier">msg</span></code>
string.
</p>
<p>
If the C++0x <code class="computeroutput"><span class="keyword">static_assert</span></code> feature
is not available, <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(</span><span class="identifier">x</span><span class="special">,</span>
<span class="identifier">msg</span><span class="special">)</span></code>
will be treated as <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">x</span><span class="special">)</span></code>.
</p>
<p>
The material that follows assumes the C++0x <code class="computeroutput"><span class="keyword">static_assert</span></code>
feature is not available.
</p>
<p>
One of the aims of <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code>
is to generate readable error messages. These immediately tell the user that
a library is being used in a manner that is not supported. While error messages
obviously differ from compiler to compiler, but you should see something
like:
</p>
<pre class="programlisting"><span class="identifier">Illegal</span> <span class="identifier">use</span> <span class="identifier">of</span> <span class="identifier">STATIC_ASSERTION_FAILURE</span><span class="special">&lt;</span><span class="keyword">false</span><span class="special">&gt;</span>
</pre>
<p>
Which is intended to at least catch the eye!
</p>
<p>
You can use <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code>
at any place where you can place a declaration, that is at class, function
or namespace scope, this is illustrated by the following examples:
</p>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_config.static_assert.intro.namespace"></a><a class="link" href="static_assert.html#boost_config.static_assert.intro.namespace" title="Use at namespace scope">Use at
namespace scope</a>
</h4></div></div></div>
<p>
The macro can be used at namespace scope, if there is some requirement
must always be true; generally this means some platform specific requirement.
Suppose we require that <code class="computeroutput"><span class="keyword">int</span></code>
be at least a 32-bit integral type, and that <code class="computeroutput"><span class="keyword">wchar_t</span></code>
be an unsigned type. We can verify this at compile time as follows:
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">climits</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cwchar</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">limits</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="keyword">static_assert</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">namespace</span> <span class="identifier">my_conditions</span> <span class="special">{</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">&gt;=</span> <span class="number">32</span><span class="special">);</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="identifier">WCHAR_MIN</span> <span class="special">&gt;=</span> <span class="number">0</span><span class="special">);</span>
<span class="special">}</span> <span class="comment">// namespace my_conditions</span>
</pre>
<p>
The use of the namespace my_conditions here requires some comment. The
macro <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code>
works by generating an typedef declaration, and since the typedef must
have a name, the macro generates one automatically by mangling a stub name
with the value of <code class="computeroutput"><span class="identifier">__LINE__</span></code>.
When <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code>
is used at either class or function scope then each use of <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code> is guaranteed to
produce a name unique to that scope (provided you only use the macro once
on each line). However when used in a header at namespace scope, that namespace
can be continued over multiple headers, each of which may have their own
static assertions, and on the "same" lines, thereby generating
duplicate declarations. In theory the compiler should silently ignore duplicate
typedef declarations, however many do not do so (and even if they do they
are entitled to emit warnings in such cases). To avoid potential problems,
if you use <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code>
in a header and at namespace scope, then enclose them in a namespace unique
to that header.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_config.static_assert.intro.function"></a><a class="link" href="static_assert.html#boost_config.static_assert.intro.function" title="Use at function scope">Use at function
scope</a>
</h4></div></div></div>
<p>
The macro is typically used at function scope inside template functions,
when the template arguments need checking. Imagine that we have an iterator-based
algorithm that requires random access iterators. If the algorithm is instantiated
with iterators that do not meet our requirements then an error will be
generated eventually, but this may be nested deep inside several templates,
making it hard for the user to determine what went wrong. One option is
to add a static assertion at the top level of the template, in that case
if the condition is not met, then an error will be generated in a way that
makes it reasonably obvious to the user that the template is being misused.
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="keyword">static_assert</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">type_traits</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">RandomAccessIterator</span> <span class="special">&gt;</span>
<span class="identifier">RandomAccessIterator</span> <span class="identifier">foo</span><span class="special">(</span><span class="identifier">RandomAccessIterator</span> <span class="identifier">from</span><span class="special">,</span>
<span class="identifier">RandomAccessIterator</span> <span class="identifier">to</span><span class="special">)</span>
<span class="special">{</span>
<span class="comment">// this template can only be used with</span>
<span class="comment">// random access iterators...</span>
<span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special">&lt;</span>
<span class="identifier">RandomAccessIterator</span> <span class="special">&gt;::</span><span class="identifier">iterator_category</span> <span class="identifier">cat</span><span class="special">;</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span>
<span class="special">(</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special">&lt;</span>
<span class="identifier">cat</span><span class="special">,</span>
<span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span><span class="special">&amp;&gt;::</span><span class="identifier">value</span><span class="special">));</span>
<span class="comment">//</span>
<span class="comment">// detail goes here...</span>
<span class="keyword">return</span> <span class="identifier">from</span><span class="special">;</span>
<span class="special">}</span>
</pre>
<p>
A couple of footnotes are in order here: the extra set of parenthesis around
the assert, is to prevent the comma inside the <code class="computeroutput"><span class="identifier">is_convertible</span></code>
template being interpreted by the preprocessor as a macro argument separator;
the target type for <code class="computeroutput"><span class="identifier">is_convertible</span></code>
is a reference type, as some compilers have problems using <code class="computeroutput"><span class="identifier">is_convertible</span></code> when the conversion is
via a user defined constructor (in any case there is no guarantee that
the iterator tag classes are copy-constructible).
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_config.static_assert.intro.class"></a><a class="link" href="static_assert.html#boost_config.static_assert.intro.class" title="Use at class scope">Use at class
scope</a>
</h4></div></div></div>
<p>
The macro is typically used inside classes that are templates. Suppose
we have a template-class that requires an unsigned integral type with at
least 16-bits of precision as a template argument, we can achieve this
using something like this:
</p>
<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">limits</span><span class="special">&gt;</span>
<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="keyword">static_assert</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">UnsignedInt</span><span class="special">&gt;</span>
<span class="keyword">class</span> <span class="identifier">myclass</span>
<span class="special">{</span>
<span class="keyword">private</span><span class="special">:</span>
<span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">UnsignedInt</span><span class="special">&gt;::</span><span class="identifier">is_specialized</span><span class="special">,</span> <span class="string">"myclass can only be specialized for types with numeric_limits support."</span><span class="special">);</span>
<span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">UnsignedInt</span><span class="special">&gt;::</span><span class="identifier">digits</span> <span class="special">&gt;=</span> <span class="number">16</span><span class="special">,</span> <span class="string">"Template argument UnsignedInt must have at least 16 bits precision."</span><span class="special">)</span>
<span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">UnsignedInt</span><span class="special">&gt;::</span><span class="identifier">is_integer</span><span class="special">,</span> <span class="string">"Template argument UnsignedInt must be an integer."</span><span class="special">);</span>
<span class="identifier">BOOST_STATIC_ASSERT_MSG</span><span class="special">(!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">numeric_limits</span><span class="special">&lt;</span><span class="identifier">UnsignedInt</span><span class="special">&gt;::</span><span class="identifier">is_signed</span><span class="special">,</span> <span class="string">"Template argument UnsignedInt must not be signed."</span><span class="special">);</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="comment">/* details here */</span>
<span class="special">};</span>
</pre>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="boost_config.static_assert.intro.templates"></a><a class="link" href="static_assert.html#boost_config.static_assert.intro.templates" title="Use in templates">Use in
templates</a>
</h4></div></div></div>
<p>
Normally static assertions when used inside a class or function template,
will not be instantiated until the template in which it is used is instantiated.
However, there is one potential problem to watch out for: if the static
assertion is not dependent upon one or more template parameters, then the
compiler is permitted to evaluate the static assertion at the point it
is first seen, irrespective of whether the template is ever instantiated,
for example:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">must_not_be_instantiated</span>
<span class="special">{</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
<span class="special">};</span>
</pre>
<p>
Will produce a compiler error with some compilers (for example Intel 8.1
or gcc 3.4), regardless of whether the template is ever instantiated. A
workaround in cases like this is to force the assertion to be dependent
upon a template parameter:
</p>
<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">must_not_be_instantiated</span>
<span class="special">{</span>
<span class="comment">// this will be triggered if this type is instantiated</span>
<span class="identifier">BOOST_STATIC_ASSERT</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">==</span> <span class="number">0</span><span class="special">);</span>
<span class="special">};</span>
</pre>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_config.static_assert.how"></a><a class="link" href="static_assert.html#boost_config.static_assert.how" title="How it works">How it works</a>
</h3></div></div></div>
<p>
<code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code> works
as follows. There is class <code class="computeroutput"><span class="identifier">STATIC_ASSERTION_FAILURE</span></code>
which is defined as:
</p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">bool</span><span class="special">&gt;</span> <span class="keyword">struct</span> <span class="identifier">STATIC_ASSERTION_FAILURE</span><span class="special">;</span>
<span class="keyword">template</span> <span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">STATIC_ASSERTION_FAILURE</span><span class="special">&lt;</span><span class="keyword">true</span><span class="special">&gt;{};</span>
<span class="special">}</span>
</pre>
<p>
The key feature is that the error message triggered by the undefined expression
<code class="computeroutput"><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">STATIC_ASSERTION_FAILURE</span><span class="special">&lt;</span><span class="number">0</span><span class="special">&gt;)</span></code>, tends
to be consistent across a wide variety of compilers. The rest of the machinery
of <code class="computeroutput"><span class="identifier">BOOST_STATIC_ASSERT</span></code> is
just a way to feed the <code class="computeroutput"><span class="keyword">sizeof</span></code>
expression into a <code class="computeroutput"><span class="keyword">typedef</span></code>. The
use of a macro here is somewhat ugly; however boost members have spent considerable
effort trying to invent a static assert that avoided macros, all to no avail.
The general conclusion was that the good of a static assert working at namespace,
function, and class scope outweighed the ugliness of a macro.
</p>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="boost_config.static_assert.test"></a><a class="link" href="static_assert.html#boost_config.static_assert.test" title="Test Programs">Test Programs</a>
</h3></div></div></div>
<div class="table">
<a name="boost_config.static_assert.test.t0"></a><p class="title"><b>Table 1. Test programs provided with static_assert</b></p>
<div class="table-contents"><table class="table" summary="Test programs provided with static_assert">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Test Program
</p>
</th>
<th>
<p>
Expected to Compile
</p>
</th>
<th>
<p>
Description
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<a href="../../../example/static_assert_example_1.cpp" target="_top">static_assert_example_1.cpp</a>
</p>
</td>
<td>
<p>
Platform dependent.
</p>
</td>
<td>
<p>
Namespace scope test program, may compile depending upon the platform.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../example/static_assert_example_2.cpp" target="_top">static_assert_example_2.cpp</a>
</p>
</td>
<td>
<p>
Yes
</p>
</td>
<td>
<p>
Function scope test program.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../example/static_assert_example_3.cpp" target="_top">static_assert_example_3.cpp</a>
</p>
</td>
<td>
<p>
Yes
</p>
</td>
<td>
<p>
Class scope test program.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test.cpp" target="_top">static_assert_test.cpp</a>
</p>
</td>
<td>
<p>
Yes
</p>
</td>
<td>
<p>
Illustrates usage, and should always compile, really just tests
compiler compatibility.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_1.cpp" target="_top">static_assert_test_fail_1.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure at namespace scope.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_2.cpp" target="_top">static_assert_test_fail_2.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure at non-template function scope.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_3.cpp" target="_top">static_assert_test_fail_3.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure at non-template class scope.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_4.cpp" target="_top">static_assert_test_fail_4.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure at non-template class scope.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_5.cpp" target="_top">static_assert_test_fail_5.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure at template class scope.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_6.cpp" target="_top">static_assert_test_fail_6.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure at template class member function scope.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_7.cpp" target="_top">static_assert_test_fail_7.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure of class scope example.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_8.cpp" target="_top">static_assert_test_fail_8.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure of function scope example.
</p>
</td>
</tr>
<tr>
<td>
<p>
<a href="../../../test/static_assert_test_fail_9.cpp" target="_top">static_assert_test_fail_9.cpp</a>
</p>
</td>
<td>
<p>
No
</p>
</td>
<td>
<p>
Illustrates failure of function scope example (part 2).
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</div>
</div>
<div class="copyright-footer">Copyright © 2001-2007 Beman Dawes, Vesa Karvonen, John
Maddock<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
</p>
</div>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="boost_macro_reference.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="build_config.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -3,7 +3,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Boost.Config</title>
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<meta name="generator" content="DocBook XSL Stylesheets Vsnapshot">
<link rel="home" href="index.html" title="Boost.Config">
<link rel="next" href="boost_config/boost_macro_reference.html" title="Boost Macro Reference">
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -92,6 +92,12 @@
<dt><span class="section"><a href="boost_config/boost_macro_reference.html#boost_config.boost_macro_reference.macros_for_libraries_with_separate_source_code">Macros
for libraries with separate source code</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="boost_config/static_assert.html">Compile-time assertions</a></span></dt>
<dd><dl>
<dt><span class="section"><a href="boost_config/static_assert.html#boost_config.static_assert.intro">Overview and Tutorial</a></span></dt>
<dt><span class="section"><a href="boost_config/static_assert.html#boost_config.static_assert.how">How it works</a></span></dt>
<dt><span class="section"><a href="boost_config/static_assert.html#boost_config.static_assert.test">Test Programs</a></span></dt>
</dl></dd>
<dt><span class="section"><a href="boost_config/build_config.html">Build Time Configuration</a></span></dt>
<dt><span class="section"><a href="boost_config/cstdint.html">Standard Integer Types</a></span></dt>
<dd><dl>

View File

@@ -1,5 +1,8 @@
index.html
boost_config/boost_macro_reference.html
boost_config/static_assert.html
boost_config/build_config.html
boost_config/cstdint.html
boost_config/guidelines_for_boost_authors.html
boost_config/rationale.html
boost_config/acknowledgements.html