Compare commits

...

108 Commits

Author SHA1 Message Date
Peter Dimov
423423e6b8 Merge pull request #533 from Lastique/feature/remove_static_assert
Remove dependencies on Boost.StaticAssert
2026-02-03 02:16:55 +02:00
Andrey Semashev
5a4da0eafa Remove dependencies on Boost.StaticAssert.
Boost.StaticAssert has been merged into Boost.Config, so remove
the dependency.
2026-01-23 23:28:22 +03:00
Peter Dimov
3d07261549 Merge pull request #532 from boostorg/pr/libstdcxx-workaround-guard
Add BOOST_LIBSTDCXX_VERSION_WORKAROUND_GUARD
2026-01-04 15:57:56 +02:00
Peter Dimov
ee10b4be2e Add BOOST_LIBSTDCXX_VERSION_WORKAROUND_GUARD 2026-01-04 14:19:26 +02:00
Peter Dimov
03dc5d2cfc Merge pull request #531 from Lastique/feature/move_static_assert
Merge Boost.StaticAssert into Boost.Config.
2025-12-26 17:46:14 +02:00
Andrey Semashev
6d997d79f9 Rebuild html docs. 2025-12-26 00:57:54 +03:00
Andrey Semashev
f14b2a48d2 Remove trailing spaces and newlines in Boost.StaticAssert sources. 2025-12-26 00:55:23 +03:00
Andrey Semashev
df3b37914f Add Boost.StaticAssert tests to Boost.Config test suite. 2025-12-26 00:55:12 +03:00
Andrey Semashev
b6945e7e5e Use a more specific include from Boost.TypeTraits in static_assert_example_2. 2025-12-26 00:55:00 +03:00
Andrey Semashev
fbe9a1a813 Update dependencies in Boost.StaticAssert examples. 2025-12-26 00:54:45 +03:00
Andrey Semashev
fa23222d35 Integrate Boost.StaticAssert docs into Boost.Config.
Convert Boost.StaticAssert to a QuickBook section and update links
to examples and tests.
2025-12-26 00:54:32 +03:00
Andrey Semashev
a8b8c0a352 Merge Boost.StaticAssert into Boost.Config.
This merges the sources, documentation, tests and examples of
Boost.StaticAssert into Boost.Config. Boost.StaticAssert is taken
at the state of Boost 1.90.0 release
(https://github.com/boostorg/static_assert/tree/boost-1.90.0).
2025-12-26 00:53:52 +03:00
Peter Dimov
503be830e7 Merge branch 'develop' 2025-12-23 11:49:54 +02:00
Peter Dimov
252f31b601 Enable GHA for feature branches 2025-12-21 22:26:35 +02:00
Peter Dimov
56239bfd88 Add support for msvc-14.5 to boost/config/auto_link.hpp 2025-12-21 22:24:34 +02:00
Peter Dimov
f6131a2900 Add support for msvc-14.5 to boost/config/compiler/visualc.hpp 2025-12-21 22:18:34 +02:00
Peter Dimov
e80fde0d7a Merge branch 'develop' 2025-12-15 19:00:53 +02:00
Peter Dimov
82f16e561a Merge pull request #497 from avjts/issue496_msvc_version
Update BOOST_COMPILER_VERSION for msvc 19.4x (VS 2022 17.10)
2025-12-15 15:12:16 +02:00
Peter Dimov
451bdf1905 Merge pull request #524 from boostorg/pr/boost-clang-version-4
Update BOOST_CLANG_VERSION to account for XCode 16.3, 16.4, 26.0, and…
2025-12-15 15:11:48 +02:00
Peter Dimov
69f219e5ef Merge pull request #529 from boostorg/mclow-patch-10
Update BOOST_VERSION and BOOST_LIB_VERSION to 1.91
2025-12-15 15:11:04 +02:00
Peter Dimov
52c7c33787 Merge branch 'develop' 2025-12-15 15:08:35 +02:00
Marshall Clow
5e0a18ace4 Update BOOST_VERSION and BOOST_LIB_VERSION to 1.91
Bump version number to 1.91
2025-12-10 14:22:36 -08:00
Peter Dimov
a7d5a9b05d Merge commit 'ecd1d07360734b1af76582118b002ca0c4448e07' 2025-10-09 16:06:50 +03:00
Peter Dimov
1cab095b32 Merge commit 'df5e7995ad04c76f0f732fc4f644683759852e24' 2025-10-09 16:03:26 +03:00
John Maddock
bf8c8bd796 Merge branch 'develop' 2025-07-04 20:36:11 +01:00
Glen Fernandes
e6a189394d Update version.hpp 2025-06-27 23:15:58 -04:00
jzmaddock
e20d6cdaa9 Merge pull request #17 from grafikrobot/modular
Add support for modular build structure.
2025-04-15 18:33:22 +01:00
John Maddock
d34312c089 Merge branch 'develop' 2025-04-15 18:31:09 +01:00
Glen Fernandes
4e9d5a3a95 Merge branch 'develop' 2024-12-16 05:26:27 -05:00
Glen Fernandes
5e98c6ddd4 Merge pull request #502 from boostorg/develop
Merge develop to master
2024-08-16 20:00:34 -04:00
Rene Rivera
ef9bb3dd14 Change all <source> references to <library>. 2024-07-20 21:26:14 -05:00
Andrzej Wojtas
b0debf9397 Update BOOST_COMPILER_VERSION for msvc 19.4x 2024-05-28 13:41:25 +02:00
Glen Fernandes
2bd6f0dfc5 Merge branch 'develop' 2024-04-18 08:20:52 -04:00
Rene Rivera
c6674fa3be Make the library modular usable. 2024-03-11 08:38:17 -05:00
jzmaddock
11385ec210 Merge branch 'develop' 2024-02-04 09:46:22 +00:00
Marshall Clow
eef05e9813 Update version.hpp to 1.85.0 2023-12-19 12:49:14 +02:00
jzmaddock
cbeca533d2 Merge for 1 84 (#490)
* Update cxxstd values for GHA msvc jobs

* Add msvc support for [[maybe_unused]] attribute.
Fixes: https://github.com/boostorg/serialization/issues/271

Also removes failing cuda+clang test as it's an inscrutable system setup issue.

* Add C++23 header macros.

* Minor corrections.

* Remove XCode-9.4 testing as it appears to be no longer supported.

* Update docs for C++23 macros.
[CI SKIP]

* Add C++23 feature test macro support.

* Use __apple_build_version__ to detect Apple clang

…since __APPLE__ is defined by both Apple Clang and LLVM.org Clang
on Apple platforms.

* Update BOOST_CLANG_VERSION for Xcode 14.3, 15.0, 15.1

* Update CI clang version now that gcc has changed. (#489)

---------

Co-authored-by: Peter Dimov <pdimov@gmail.com>
Co-authored-by: Christopher Chavez <chrischavez@gmx.us>
2023-11-04 09:27:38 +00:00
jzmaddock
b880cbe525 Merge pull request #16 from igaztanaga/patch-1
Small fix for Wsign-conversion
2021-10-13 16:03:23 +01:00
Ion Gaztañaga
e2983cb02a Small fix for Wsign-conversion 2021-10-13 15:10:36 +02:00
jzmaddock
7b6cc74b40 Merge pull request #11 from eldiener/develop
Changes for Embarcadero C++ clang-based compilers, targeting Boost 1.74. Use BOOST_BORLANDC for bcc32 compiler
2020-05-06 17:34:09 +01:00
Edward Diener
cc8d9218eb Use BOOST_BORLANDC for bcc32 compiler 2020-03-21 22:24:50 -04:00
Peter Dimov
dad8996fbf Change LIBRARIES to LINK_LIBRARIES 2019-12-27 04:20:36 +02:00
Peter Dimov
0d0287b807 Add CMake testing support 2019-12-26 18:58:11 +02:00
jzmaddock
42b9b37008 Merge pull request #7 from LukeCz/patch-1
Simplified boolean expression
2019-02-27 18:07:02 +00:00
Lukasz Czajczyk
3db1d41a75 Simplified boolean expression 2019-01-21 16:50:00 -06:00
jzmaddock
967e92f224 Move header dependencies around -
to try to fix a clang-3.x issue with ::gets not found when compiling std lib header.
2018-09-25 18:25:26 +01:00
jzmaddock
a675151de2 Fix doc directory paths. 2016-06-14 18:39:54 +01:00
jzmaddock
96ba95f801 Move files into standard directory structure. 2016-06-14 18:37:24 +01:00
jzmaddock
f79d0116a4 Merge pull request #3 from morinmorin/fix/unused_attribute
Use Boost.Config's BOOST_ATTRIBUTE_UNUSED
2015-09-10 19:21:39 +01:00
morinmorin
4157a83c25 Use Boost.Config's BOOST_ATTRIBUTE_UNUSED. 2015-09-11 02:08:43 +09:00
jzmaddock
1923293beb Merge branch 'develop' 2015-09-10 10:17:52 +01:00
jzmaddock
3620dda68b Merge pull request #2 from mgaunard/clang_warning_fix
Avoid unused typedef warnings with clang
2014-10-02 18:28:18 +01:00
Mathias Gaunard
2d9fc36f5b enable __attribute__((unused)) to avoid unused typedef warnings with all gcc-like variants starting with gcc 4.0. Avoids generating the warning with Clang among others. 2014-09-29 14:55:39 +02:00
Daniel James
4e1be139fb Create merge base for git. 2014-04-06 14:27:40 +01:00
jzmaddock
a8d9b89443 If we have a static_assert we should use it, even if there are no variadic macros. 2013-12-11 18:57:43 +00:00
Stephen Kelly
3de83675c9 StaticAssert: Remove obsolete MSVC version check.
[SVN r86035]
2013-09-30 00:20:43 +00:00
John Maddock
ec95d0d58f Merge static_assert fix from Trunk.
Fixes #8644.

[SVN r84858]
2013-06-21 12:27:49 +00:00
John Maddock
930573dc0d Apply patch from 8644.
Fixes #8644.

[SVN r84713]
2013-06-09 12:02:07 +00:00
John Maddock
e127b66f16 Apply patch from #8644.
Refs #8644.

[SVN r84686]
2013-06-08 10:58:41 +00:00
John Maddock
118eb5ee7f Fix for compilers that have no variadic macros but do have static_assert (are there any??)
Fixes #8346.

[SVN r83806]
2013-04-08 08:45:06 +00:00
John Maddock
01056328f1 Merge patches from Trunk.
[SVN r83496]
2013-03-19 18:10:39 +00:00
John Maddock
c5c902cedc More variadic macro support for msvc and Intel.
[SVN r83444]
2013-03-15 18:21:03 +00:00
John Maddock
7373410f6b Suppress GCC warnings.
[SVN r83104]
2013-02-23 18:26:39 +00:00
John Maddock
b96f21aeb1 Use variadic macros in static assert to make use easier.
Add warning suppression for GCC.
Minor doc fix.
Fixes #5810.
Fixes #7242.
Fixes #7966.

[SVN r82886]
2013-02-14 18:31:33 +00:00
John Maddock
34f7a0c55c Merge changes from Trunk.
[SVN r81828]
2012-12-10 17:28:53 +00:00
Marshall Clow
fa81fc37a4 Removed missed usage of deprecated macros in Boost.StaticAssert
[SVN r81588]
2012-11-27 14:30:10 +00:00
John Maddock
f54046a00c Fix doc typo.
Fixes #6355.

[SVN r80059]
2012-08-16 08:14:53 +00:00
John Maddock
8b8c376d50 Merge documentation and property change fixes from Trunk.
[SVN r71486]
2011-04-25 17:27:05 +00:00
Beman Dawes
ac41ae6e78 Merge trunk BOOST_ASSERT_MSG additions
[SVN r68912]
2011-02-15 14:54:16 +00:00
Beman Dawes
fc3b6f5df3 Add BOOST_STATIC_ASSERT_MSG
[SVN r68584]
2011-01-31 15:03:41 +00:00
John Maddock
0a67f80dcb Change PDF URL to SF download page.
[SVN r67530]
2011-01-01 12:32:32 +00:00
John Maddock
6bece70dc0 Change PDF URL to SF download page.
[SVN r67529]
2011-01-01 12:28:35 +00:00
Beman Dawes
80237a2113 Use BOOST_NO_STATIC_ASSERT
[SVN r59698]
2010-02-16 12:45:53 +00:00
John Maddock
2c63b49577 Merge PDF build changes from Trunk.
[SVN r51417]
2009-02-23 18:39:32 +00:00
John Maddock
55c3c4a037 Fix inclusion of incorrect header.
Fixes #2537.

[SVN r50371]
2008-12-23 12:03:43 +00:00
Daniel James
2938fe1744 Merge some documentation updates and fixes from trunk.
Merged revisions 47364,47402-47403 via svnmerge from 
https://svn.boost.org/svn/boost/trunk

........
  r47364 | danieljames | 2008-07-12 20:32:15 +0100 (Sat, 12 Jul 2008) | 1 line
  
  Fix a PDF link that I missed before. (in static assert)
........
  r47402 | danieljames | 2008-07-13 20:42:56 +0100 (Sun, 13 Jul 2008) | 2 lines
  
  Note that emplace is only available on a few compilers.
........
  r47403 | danieljames | 2008-07-13 21:07:45 +0100 (Sun, 13 Jul 2008) | 2 lines
  
  Update the implementation details.
........


[SVN r47405]
2008-07-13 21:08:33 +00:00
Daniel James
4658bd6d5e Fix a PDF link that I missed before.
[SVN r47364]
2008-07-12 19:32:15 +00:00
John Maddock
42245b6d6e Merge changes from Trunk.
[SVN r47306]
2008-07-11 10:49:31 +00:00
John Maddock
0478338e3e Changed BOOST_STATIC_ASSERT for GCC to suppress warnings about old C style casts.
[SVN r43988]
2008-04-01 17:53:56 +00:00
John Maddock
a0afc2bccc Merge minor change from Trunk.
[SVN r43358]
2008-02-21 16:51:41 +00:00
John Maddock
393f5d7047 Added link to PDF docs.
[SVN r43357]
2008-02-21 16:49:59 +00:00
Beman Dawes
dc59e38da6 Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41370]
2007-11-25 18:38:02 +00:00
Beman Dawes
a2c1599d9b Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41369]
2007-11-25 18:07:19 +00:00
Beman Dawes
f03a0347c5 Starting point for releases
[SVN r39706]
2007-10-05 14:25:06 +00:00
nobody
416339d3bf This commit was manufactured by cvs2svn to create tag
'Version_1_34_1'.

[SVN r38286]
2007-07-24 19:28:14 +00:00
John Maddock
db93eae3b6 Added links to PDF docs.
[SVN r37653]
2007-05-09 17:20:56 +00:00
Douglas Gregor
f6c1ca6731 Fix C++0x helper macros
[SVN r37178]
2007-03-14 09:20:38 +00:00
Douglas Gregor
325fec03a2 Preliminary C++0x support
[SVN r36149]
2006-11-22 15:58:39 +00:00
John Maddock
45c007e880 Added trivial docs change, based on user suggestion, and brought example code into synch.
[SVN r34874]
2006-08-11 18:14:13 +00:00
Rene Rivera
c47ccbfaba Add custom static_assert for CodeWarrior <= 8. Which works in all contexts, specifically it works inside tempalte function contexts which the standard one doesn't. This makes all tests pass for this compiler for the first time.
[SVN r28941]
2005-05-15 22:40:40 +00:00
John Maddock
1760ab4936 Fixed library information in docs.
Updated examples to match new docs.


[SVN r28289]
2005-04-17 10:45:13 +00:00
John Maddock
b0ffe9b249 Added new style docs
[SVN r28280]
2005-04-16 16:33:02 +00:00
John Maddock
162e483c40 Improved gcc 3.3 and 3.4 error messages.
[SVN r25413]
2004-09-26 10:24:34 +00:00
Giovanni Bajo
01b5422dd2 MWCW 8.3 no longer needs the enum version. This fixes a problem in Spirit, because of two header files both having a static assert at the same line.
[SVN r21364]
2003-12-21 16:34:52 +00:00
John Maddock
59004c74c7 Added new licence info.
[SVN r20254]
2003-10-04 11:29:20 +00:00
John Maddock
6532eb2f15 Updated licence
[SVN r20237]
2003-10-01 10:28:17 +00:00
John Maddock
aa130ddb7f Added __COUNTER__ based version for VC7 and later.
[SVN r19043]
2003-07-11 11:01:55 +00:00
Jens Maurer
b8a3b94abd add special version for SGI MIPSpro compiler
[SVN r18173]
2003-04-03 22:33:23 +00:00
Beman Dawes
21c5dcc433 add or update See www.boost.org comments
[SVN r16708]
2002-12-27 16:51:53 +00:00
Aleksey Gurtovoy
9a88554905 Intel C++ fix
[SVN r15351]
2002-09-16 01:19:05 +00:00
John Maddock
82248117e8 Stripped tabs from source
[SVN r12351]
2002-01-19 12:38:14 +00:00
John Maddock
cad0772d55 commit of split-config, including any changes required to existing libraries (mainly regex).
[SVN r11138]
2001-09-18 11:13:39 +00:00
John Maddock
147e68e2e6 Added comment about lack of static_cast
[SVN r10243]
2001-05-30 11:31:15 +00:00
John Maddock
7a76a4a2ce cast integral constant expression to bool to fix some compiler warnings and some compiler bugs.
[SVN r10230]
2001-05-26 10:58:43 +00:00
Jens Maurer
01f661c4e4 add HP aCC workarounds
[SVN r10025]
2001-05-05 20:26:38 +00:00
John Maddock
739db3d0b9 fixed typo
[SVN r9836]
2001-04-19 10:53:11 +00:00
John Maddock
0860281df1 tentative fix for MWCW
[SVN r8914]
2001-02-04 12:59:54 +00:00
John Maddock
53e02dbc92 Static assert initial checkin
[SVN r8381]
2000-12-03 12:29:42 +00:00
37 changed files with 1567 additions and 46 deletions

View File

@@ -26,7 +26,6 @@ git submodule update --init libs/core
git submodule update --init libs/assert
git submodule update --init libs/type_traits
git submodule update --init libs/throw_exception
git submodule update --init libs/static_assert
git submodule update --init libs/preprocessor
cp -r $TRAVIS_BUILD_DIR/* libs/config
./bootstrap.sh

View File

@@ -10,6 +10,7 @@ on:
branches:
- master
- develop
- feature/**
pull_request:
release:
types: [published, created, edited]
@@ -33,7 +34,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: cp -r $GITHUB_WORKSPACE/* libs/config
@@ -72,7 +73,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: cp -r $GITHUB_WORKSPACE/* libs/config
@@ -111,7 +112,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: cp -r $GITHUB_WORKSPACE/* libs/config
@@ -144,7 +145,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: cp -r $GITHUB_WORKSPACE/* libs/config
@@ -177,7 +178,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\config
@@ -210,7 +211,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\config
@@ -258,7 +259,7 @@ jobs:
cd boost-root
rm -rf libs/config/*
cp -r $config/* libs/config
git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
./bootstrap.sh
./b2 headers
./b2 toolset=gcc libs/config/test//print_config_info libs/config/test//print_math_info
@@ -294,7 +295,7 @@ jobs:
cd boost-root
rm -rf libs/config/*
cp -r $config/* libs/config
git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
./bootstrap.sh
./b2 headers
./b2 toolset=clang libs/config/test//print_config_info libs/config/test//print_math_info
@@ -325,7 +326,7 @@ jobs:
- name: Checkout main boost
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
- name: Update Dependencies
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/static_assert libs/throw_exception libs/preprocessor
run: git submodule update --init tools/build tools/boost_install libs/headers libs/detail libs/core libs/assert libs/type_traits libs/throw_exception libs/preprocessor
working-directory: ../boost-root
- name: Copy files
run: cp -r $GITHUB_WORKSPACE/* libs/config

View File

@@ -65,7 +65,6 @@ install:
- git submodule update --init libs/core
- git submodule update --init libs/assert
- git submodule update --init libs/type_traits
- git submodule update --init libs/static_assert
- git submodule update --init libs/throw_exception
- git submodule update --init libs/preprocessor
- bootstrap

View File

@@ -49,6 +49,7 @@ Distributed under the Boost Software License, Version 1.0.
[include configuring_boost.qbk]
[include macro_reference.qbk]
[include static_assert.qbk]
[include build_time.qbk]
[include cstdint.qbk]
[include guidelines.qbk]

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

234
doc/static_assert.qbk Normal file
View File

@@ -0,0 +1,234 @@
[/
Boost.StaticAssert
Copyright (c) 2000, 2005 Steve Cleary and John Maddock
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
https://www.boost.org/LICENSE_1_0.txt)
]
[section:static_assert Compile-time assertions]
[section:intro Overview and Tutorial]
The header `<boost/static_assert.hpp>` supplies two macros:
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
"static assertion" throughout these docs. Note that if the condition is `true`,
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.
If the C++0x `static_assert` feature is available, both macros will use it.
For `BOOST_STATIC_ASSERT(x)`, the error message will 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.
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:
Illegal use of STATIC_ASSERTION_FAILURE<false>
Which is intended to at least catch the eye!
You can use `BOOST_STATIC_ASSERT` at any place where you can place a declaration,
that is at class, function or namespace scope, this is illustrated by the
following examples:
[section:namespace Use at namespace scope]
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 `int` be at least a 32-bit integral type, and that `wchar_t`
be an unsigned type. We can verify this at compile time as follows:
#include <climits>
#include <cwchar>
#include <limits>
#include <boost/static_assert.hpp>
namespace my_conditions {
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits >= 32);
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
} // namespace my_conditions
The use of the namespace my_conditions here requires some comment.
The macro `BOOST_STATIC_ASSERT` 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 `__LINE__`. When `BOOST_STATIC_ASSERT` is
used at either class or function scope then each use of `BOOST_STATIC_ASSERT`
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 `BOOST_STATIC_ASSERT` in a header and at namespace scope, then enclose
them in a namespace unique to that header.
[endsect]
[section:function Use at function scope]
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.
#include <iterator>
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
template <class RandomAccessIterator >
RandomAccessIterator foo(RandomAccessIterator from,
RandomAccessIterator to)
{
// this template can only be used with
// random access iterators...
typedef typename std::iterator_traits<
RandomAccessIterator >::iterator_category cat;
BOOST_STATIC_ASSERT(
(boost::is_convertible<
cat,
const std::random_access_iterator_tag&>::value));
//
// detail goes here...
return from;
}
A couple of footnotes are in order here: the extra set of parenthesis around the
assert, is to prevent the comma inside the `is_convertible` template being
interpreted by the preprocessor as a macro argument separator; the target type
for `is_convertible` is a reference type, as some compilers have problems
using `is_convertible` when the conversion is via a user defined constructor
(in any case there is no guarantee that the iterator tag classes are
copy-constructible).
[endsect]
[section:class Use at class scope]
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:
#include <limits>
#include <boost/static_assert.hpp>
template <class UnsignedInt>
class myclass
{
private:
BOOST_STATIC_ASSERT_MSG(std::numeric_limits<UnsignedInt>::is_specialized, "myclass can only be specialized for types with numeric_limits support.");
BOOST_STATIC_ASSERT_MSG(std::numeric_limits<UnsignedInt>::digits >= 16, "Template argument UnsignedInt must have at least 16 bits precision.")
BOOST_STATIC_ASSERT_MSG(std::numeric_limits<UnsignedInt>::is_integer, "Template argument UnsignedInt must be an integer.");
BOOST_STATIC_ASSERT_MSG(!std::numeric_limits<UnsignedInt>::is_signed, "Template argument UnsignedInt must not be signed.");
public:
/* details here */
};
[endsect]
[section:templates Use in templates]
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:
template <class T>
struct must_not_be_instantiated
{
BOOST_STATIC_ASSERT(false);
};
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:
template <class T>
struct must_not_be_instantiated
{
// this will be triggered if this type is instantiated
BOOST_STATIC_ASSERT(sizeof(T) == 0);
};
[endsect]
[endsect]
[section:how How it works]
`BOOST_STATIC_ASSERT` works as follows. There is class `STATIC_ASSERTION_FAILURE`
which is defined as:
namespace boost{
template <bool> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true>{};
}
The key feature is that the error message triggered by the undefined
expression `sizeof(STATIC_ASSERTION_FAILURE<0>)`, tends to be consistent
across a wide variety of compilers. The rest of the machinery of
`BOOST_STATIC_ASSERT` is just a way to feed the `sizeof` expression into a `typedef`.
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.
[endsect]
[section:test Test Programs]
[table Test programs provided with static_assert
[[Test Program][Expected to Compile][Description]]
[[[@../../example/static_assert_example_1.cpp static_assert_example_1.cpp]] [Platform dependent.] [Namespace scope test program, may compile depending upon the platform. ]]
[[[@../../example/static_assert_example_2.cpp static_assert_example_2.cpp]] [Yes] [Function scope test program. ]]
[[[@../../example/static_assert_example_3.cpp static_assert_example_3.cpp]] [Yes] [Class scope test program. ]]
[[[@../../test/static_assert_test.cpp static_assert_test.cpp]] [Yes] [Illustrates usage, and should always compile, really just tests compiler compatibility.]]
[[[@../../test/static_assert_test_fail_1.cpp static_assert_test_fail_1.cpp]] [No] [Illustrates failure at namespace scope. ]]
[[[@../../test/static_assert_test_fail_2.cpp static_assert_test_fail_2.cpp]] [No] [Illustrates failure at non-template function scope. ]]
[[[@../../test/static_assert_test_fail_3.cpp static_assert_test_fail_3.cpp]] [No] [Illustrates failure at non-template class scope. ]]
[[[@../../test/static_assert_test_fail_4.cpp static_assert_test_fail_4.cpp]] [No] [Illustrates failure at non-template class scope. ]]
[[[@../../test/static_assert_test_fail_5.cpp static_assert_test_fail_5.cpp]] [No] [Illustrates failure at template class scope. ]]
[[[@../../test/static_assert_test_fail_6.cpp static_assert_test_fail_6.cpp]] [No] [Illustrates failure at template class member function scope. ]]
[[[@../../test/static_assert_test_fail_7.cpp static_assert_test_fail_7.cpp]] [No] [Illustrates failure of class scope example. ]]
[[[@../../test/static_assert_test_fail_8.cpp static_assert_test_fail_8.cpp]] [No] [Illustrates failure of function scope example. ]]
[[[@../../test/static_assert_test_fail_9.cpp static_assert_test_fail_9.cpp]] [No] [Illustrates failure of function scope example (part 2). ]]
]
[endsect]
[endsect]

11
example/CMakeLists.txt Normal file
View File

@@ -0,0 +1,11 @@
# Copyright 2018, 2019 Peter Dimov
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt
include(BoostTestJamfile OPTIONAL RESULT_VARIABLE HAVE_BOOST_TEST)
if(HAVE_BOOST_TEST)
boost_test_jamfile(FILE Jamfile.v2 LINK_LIBRARIES Boost::config Boost::type_traits)
endif()

16
example/Jamfile.v2 Normal file
View File

@@ -0,0 +1,16 @@
# copyright John Maddock 2003
# Use, modification and distribution are subject to the
# Boost Software License, Version 1.0. (See accompanying file
# LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
# bring in the rules for testing
import testing ;
project : requirements
<library>/boost/config//boost_config
<library>/boost/type_traits//boost_type_traits
;
#run static_assert_example_1.cpp ;
run static_assert_example_2.cpp ;
run static_assert_example_3.cpp ;

View File

@@ -0,0 +1,30 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <climits>
#include <cwchar>
#include <limits>
#include <boost/static_assert.hpp>
#if !defined(WCHAR_MIN)
#define WCHAR_MIN 0
#endif
namespace boost{
namespace my_conditions {
BOOST_STATIC_ASSERT(std::numeric_limits<int>::digits >= 32);
BOOST_STATIC_ASSERT(WCHAR_MIN >= 0);
} // namespace my_conditions
} // namespace boost
int main()
{
return 0;
}

View File

@@ -0,0 +1,33 @@
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_convertible.hpp>
#include <iterator>
#include <list>
#include <deque>
template <class RandomAccessIterator >
RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator /*to*/)
{
// this template can only be used with
// random access iterators...
typedef typename std::iterator_traits< RandomAccessIterator >::iterator_category cat;
BOOST_STATIC_ASSERT((boost::is_convertible<cat, const std::random_access_iterator_tag&>::value));
//
// detail goes here...
return from;
}
int main()
{
std::deque<int> d;
std::list<int> l;
foo(d.begin(), d.end()); // OK
//foo(l.begin(), l.end()); // error
return 0;
}

View File

@@ -0,0 +1,31 @@
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <limits>
#include <boost/limits.hpp>
#include <boost/static_assert.hpp>
template <class UnsignedInt>
class myclass
{
private:
BOOST_STATIC_ASSERT((std::numeric_limits<UnsignedInt>::digits >= 16)
&& std::numeric_limits<UnsignedInt>::is_specialized
&& std::numeric_limits<UnsignedInt>::is_integer
&& !std::numeric_limits<UnsignedInt>::is_signed);
public:
/* details here */
};
myclass<unsigned> m1; // this should be OK
//myclass<int> m2; // this should fail
//myclass<unsigned char> m3; // and so should this
int main()
{
return 0;
}

View File

@@ -187,11 +187,16 @@ BOOST_LIB_SUFFIX: Static/import libraries extension (".lib", ".a") for the c
// vc14.2:
# define BOOST_LIB_TOOLSET "vc142"
# elif defined(BOOST_MSVC)
# elif defined(BOOST_MSVC) && (BOOST_MSVC < 1950)
// vc14.3:
# define BOOST_LIB_TOOLSET "vc143"
# elif defined(BOOST_MSVC)
// vc14.5:
# define BOOST_LIB_TOOLSET "vc145"
# elif defined(BOOST_EMBTC_WINDOWS)
// Embarcadero Clang based compilers:

View File

@@ -372,8 +372,10 @@
# define BOOST_COMPILER_VERSION 14.1
# elif _MSC_VER < 1930
# define BOOST_COMPILER_VERSION 14.2
# elif _MSC_VER < 1940
# elif _MSC_VER < 1950
# define BOOST_COMPILER_VERSION 14.3
# elif _MSC_VER < 1960
# define BOOST_COMPILER_VERSION 14.5
# else
# define BOOST_COMPILER_VERSION _MSC_VER
# endif
@@ -385,8 +387,8 @@
#include <boost/config/pragma_message.hpp>
//
// last known and checked version is 19.3x (VS2022):
#if (_MSC_VER >= 1940)
// last known and checked version is 19.5x (VS2026):
#if (_MSC_VER >= 1960)
# if defined(BOOST_ASSERT_CONFIG)
# error "Boost.Config is older than your current compiler version."
# elif !defined(BOOST_CONFIG_SUPPRESS_OUTDATED_MESSAGE)

View File

@@ -264,6 +264,11 @@
#else
#define BOOST_CLANG_VERSION_WORKAROUND_GUARD 0
#endif
#ifndef BOOST_LIBSTDCXX_VERSION
#define BOOST_LIBSTDCXX_VERSION_WORKAROUND_GUARD 1
#else
#define BOOST_LIBSTDCXX_VERSION_WORKAROUND_GUARD 0
#endif
// Always define to zero, if it's used it'll be defined my MPL:
#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0

View File

@@ -0,0 +1,179 @@
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org/libs/static_assert for documentation.
/*
Revision history:
02 August 2000
Initial version.
*/
#ifndef BOOST_STATIC_ASSERT_HPP
#define BOOST_STATIC_ASSERT_HPP
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#include <cstddef> //for std::size_t
#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)
//
// This is horrible, but it seems to be the only we can shut up the
// "anonymous variadic macros were introduced in C99 [-Wvariadic-macros]"
// warning that get spewed out otherwise in non-C++11 mode.
//
#pragma GCC system_header
#endif
#ifndef BOOST_NO_CXX11_STATIC_ASSERT
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)
# else
# define BOOST_STATIC_ASSERT_MSG( B, Msg ) static_assert( B, Msg )
# endif
#else
# define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )
#endif
#ifdef BOOST_BORLANDC
//
// workaround for buggy integral-constant expression support:
#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS
#endif
#if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4))
// gcc 3.3 and 3.4 don't produce good error messages with the default version:
# define BOOST_SA_GCC_WORKAROUND
#endif
//
// If the compiler issues warnings about old C style casts,
// then enable this:
//
#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) ((__VA_ARGS__) != 0)
# else
# define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) != 0)
# endif
#else
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) (bool)(__VA_ARGS__)
# else
# define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)
# endif
#endif
#ifndef BOOST_NO_CXX11_STATIC_ASSERT
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)
# else
# define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)
# endif
#else
namespace boost{
// HP aCC cannot deal with missing names for template value parameters
template <bool x> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
// HP aCC cannot deal with missing names for template value parameters
template<std::size_t x> struct static_assert_test{};
}
//
// Implicit instantiation requires that all member declarations be
// instantiated, but that the definitions are *not* instantiated.
//
// It's not particularly clear how this applies to enum's or typedefs;
// both are described as declarations [7.1.3] and [7.2] in the standard,
// however some compilers use "delayed evaluation" of one or more of
// these when implicitly instantiating templates. We use typedef declarations
// by default, but try defining BOOST_USE_ENUM_STATIC_ASSERT if the enum
// version gets better results from your compiler...
//
// Implementation:
// Both of these versions rely on sizeof(incomplete_type) generating an error
// message containing the name of the incomplete type. We use
// "STATIC_ASSERTION_FAILURE" as the type name here to generate
// an eye catching error message. The result of the sizeof expression is either
// used as an enum initialiser, or as a template argument depending which version
// is in use...
// Note that the argument to the assert is explicitly cast to bool using old-
// style casts: too many compilers currently have problems with static_cast
// when used inside integral constant expressions.
//
#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)
#if defined(BOOST_MSVC) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
#define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
#elif defined(BOOST_MSVC)
#define BOOST_STATIC_ASSERT(...) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST (__VA_ARGS__) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)
#elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND)) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)
// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error
// instead of warning in case of failure
# define BOOST_STATIC_ASSERT( B ) \
typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
[ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ]
#elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND)) && !defined(BOOST_NO_CXX11_VARIADIC_MACROS)
// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error
// instead of warning in case of failure
# define BOOST_STATIC_ASSERT(...) \
typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \
[ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >::value ]
#elif defined(__sgi)
// special version for SGI MIPSpro compiler
#define BOOST_STATIC_ASSERT( B ) \
BOOST_STATIC_CONSTANT(bool, \
BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< \
BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
#elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
// special version for CodeWarrior <= 8.x
#define BOOST_STATIC_ASSERT( B ) \
BOOST_STATIC_CONSTANT(int, \
BOOST_JOIN(boost_static_assert_test_, __LINE__) = \
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) )
#else
// generic version
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT( ... ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
# else
# define BOOST_STATIC_ASSERT( B ) \
typedef ::boost::static_assert_test<\
sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\
BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED
# endif
#endif
#else
// alternative enum based implementation:
# ifndef BOOST_NO_CXX11_VARIADIC_MACROS
# define BOOST_STATIC_ASSERT( ... ) \
enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
= sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( __VA_ARGS__ ) >) }
# else
# define BOOST_STATIC_ASSERT(B) \
enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \
= sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }
# endif
#endif
#endif // defined(BOOST_NO_CXX11_STATIC_ASSERT)
#endif // BOOST_STATIC_ASSERT_HPP

View File

@@ -19,7 +19,7 @@
// BOOST_VERSION / 100 % 1000 is the minor version
// BOOST_VERSION / 100000 is the major version
#define BOOST_VERSION 109000
#define BOOST_VERSION 109100
//
// BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
@@ -27,6 +27,6 @@
// number, y is the minor version number, and z is the patch level if not 0.
// This is used by <config/auto_link.hpp> to select which library version to link to.
#define BOOST_LIB_VERSION "1_90"
#define BOOST_LIB_VERSION "1_91"
#endif

View File

@@ -118,6 +118,20 @@ test-suite config
[ compile header_deprecated_test.cpp ]
[ compile symbol_deprecated_test.cpp ]
[ compile boost_override_test.cpp ]
[ run static_assert_test.cpp ]
[ compile-fail static_assert_test_fail_1.cpp ]
[ compile-fail static_assert_test_fail_2.cpp ]
[ compile-fail static_assert_test_fail_3.cpp ]
[ compile-fail static_assert_test_fail_4.cpp ]
[ compile-fail static_assert_test_fail_5.cpp ]
[ compile-fail static_assert_test_fail_6.cpp ]
[ compile-fail static_assert_test_fail_7.cpp ]
[ compile-fail static_assert_test_fail_8.cpp ]
[ compile-fail static_assert_test_fail_9.cpp ]
[ compile-fail static_assert_test_fail_10.cpp ]
[ build-project ../example ]
;
obj has_clang_implicit_fallthrough : cmd_line_check.cpp :

View File

@@ -1273,22 +1273,6 @@ void print_boost_macros()
PRINT_MACRO(BOOST_NO_VOID_RETURNS);
// END GENERATED BLOCK
PRINT_MACRO(BOOST_CXX_VERSION);

103
test/static_assert_test.cpp Normal file
View File

@@ -0,0 +1,103 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
//
// all these tests should succeed.
// some of these tests are rather simplistic (ie useless)
// in order to ensure that they compile on all platforms.
//
// Namespace scope
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
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
void f()
{
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
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
{
private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(int) >= sizeof(short));
BOOST_STATIC_ASSERT(sizeof(char) == 1);
BOOST_STATIC_ASSERT_MSG(sizeof(int) >= sizeof(short), "msg5");
BOOST_STATIC_ASSERT_MSG(sizeof(char) == 1, "msg6");
public:
// Member function scope: provides access to member variables
int x;
char c;
int f()
{
#if defined(_MSC_VER) && _MSC_VER < 1300 // broken sizeof in VC6
BOOST_STATIC_ASSERT(sizeof(x) >= sizeof(short));
BOOST_STATIC_ASSERT(sizeof(c) == 1);
BOOST_STATIC_ASSERT_MSG(sizeof(x) >= sizeof(short), "msg7");
BOOST_STATIC_ASSERT_MSG(sizeof(c) == 1, "msg8");
#endif
return x;
}
};
// Template class scope
template <class Int, class Char>
struct Bill
{
BOOST_STATIC_CONSTANT(int, value = 1);
private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(Int) > sizeof(char));
BOOST_STATIC_ASSERT_MSG(sizeof(Int) > sizeof(char), "msg9");
public:
// Template member function scope: provides access to member variables
Int x;
Char c;
template <class Int2, class Char2>
void f(Int2 , Char2 )
{
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
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_STATIC_ASSERTs are not triggerred until instantiated
{
Bill<int, char> z;
//Bill<int, int> bad; // will not compile
int i = 3;
char ch = 'a';
z.f(i, ch);
//z.f(i, i); // should not compile
}
int main()
{
test_Bill();
//
// Test variadic macro support:
//
#ifndef BOOST_NO_CXX11_VARIADIC_MACROS
BOOST_STATIC_ASSERT(Bill<int, char>::value);
#ifndef BOOST_NO_CXX11_STATIC_ASSERT
BOOST_STATIC_ASSERT_MSG(Bill<int, char>::value, "This is a message");
#endif
#endif
return 0;
}

View File

@@ -0,0 +1,17 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
//
// all these tests should fail:
//
typedef char a1[2];
typedef char a2[3];
// Namespace scope
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile

View File

@@ -0,0 +1,18 @@
//~ Copyright 2005 Redshift Software, Inc.
//~ Distributed under the Boost Software License, Version 1.0.
//~ (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
#include <boost/static_assert.hpp>
template <int N>
int foo()
{
BOOST_STATIC_ASSERT( N < 2 );
return N;
}
int main()
{
return foo<5>();
}

View File

@@ -0,0 +1,20 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
//
// all these tests should fail:
//
typedef char a1[2];
typedef char a2[3];
// Function (block) scope
void f()
{
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // should not compile
}

View File

@@ -0,0 +1,33 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
//
// this tests should fail:
//
typedef char a1[2];
typedef char a2[3];
struct Bob
{
private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(a1) == sizeof(a2)); // will not compile
public:
// Member function scope: provides access to member variables
int x;
char c;
int f()
{
#ifndef _MSC_VER // broken sizeof in VC6
BOOST_STATIC_ASSERT(sizeof(x) == 4);
BOOST_STATIC_ASSERT(sizeof(c) == 1);
#endif
return x;
}
};

View File

@@ -0,0 +1,32 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/config.hpp>
#include <boost/static_assert.hpp>
//
// all these tests should fail:
//
struct Bob
{
public:
// Member function scope: provides access to member variables
char x[4];
char c;
int f()
{
#if !defined(BOOST_MSVC) || BOOST_MSVC > 1200 // broken sizeof in VC6
BOOST_STATIC_ASSERT(sizeof(x) == 4);
BOOST_STATIC_ASSERT(sizeof(c) == 1);
BOOST_STATIC_ASSERT((sizeof(x) == sizeof(c))); // should not compile
#endif
return x;
}
};

View File

@@ -0,0 +1,35 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
//
// all these tests should fail:
//
// Template class scope
template <class Int, class Char>
struct Bill
{
private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(Int) == 4);
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
public:
// Template member function scope: provides access to member variables
Int x;
Char c;
template <class Int2, class Char2>
void f(Int2 , Char2 )
{
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
//BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
}
};
Bill<int, char> b;

View File

@@ -0,0 +1,42 @@
// (C) Copyright Steve Cleary & John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <boost/static_assert.hpp>
//
// all these tests should fail:
//
// Template class scope
template <class Int, class Char>
struct Bill
{
private: // can be in private, to avoid namespace pollution
BOOST_STATIC_ASSERT(sizeof(Int) == 4);
//BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
public:
// Template member function scope: provides access to member variables
Int x;
Char c;
template <class Int2, class Char2>
void f(Int2 , Char2 )
{
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Int2));
BOOST_STATIC_ASSERT(sizeof(Char) == sizeof(Char2));
BOOST_STATIC_ASSERT(sizeof(Int) == sizeof(Char)); // should not compile when instantiated
}
};
void foo()
{
int i = 0;
char c = 0;
Bill<int, char> b;
// this should fail:
b.f(i, c);
}

View File

@@ -0,0 +1,30 @@
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <climits>
#include <boost/limits.hpp>
#include <boost/static_assert.hpp>
template <class UnsignedInt>
class myclass
{
private:
BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16);
BOOST_STATIC_ASSERT(std::numeric_limits<UnsignedInt>::is_specialized
&& std::numeric_limits<UnsignedInt>::is_integer
&& !std::numeric_limits<UnsignedInt>::is_signed);
public:
/* details here */
};
myclass<int> m2; // this should fail
myclass<unsigned char> m3; // and so should this
int main()
{
return 0;
}

View File

@@ -0,0 +1,39 @@
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <iterator>
#include <list>
#include <deque>
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
template <class RandomAccessIterator >
RandomAccessIterator foo(RandomAccessIterator from, RandomAccessIterator)
{
// this template can only be used with
// random access iterators...
typedef typename std::iterator_traits< RandomAccessIterator >::iterator_category cat;
BOOST_STATIC_ASSERT((boost::is_convertible<cat*, std::random_access_iterator_tag*>::value));
//
// detail goes here...
return from;
}
// ensure that delayed instantiation compilers like Comeau see the failure early
// enough for "compile-fail" testing with the Boost.Build testing framework. (Greg Comeau)
template
std::list<int>::iterator
foo(std::list<int>::iterator, std::list<int>::iterator);
int main()
{
std::deque<int> d;
std::list<int> l;
foo(d.begin(), d.end()); // OK
foo(l.begin(), l.end()); // error
return 0;
}

View File

@@ -0,0 +1,31 @@
// (C) Copyright John Maddock 2000.
// Use, modification and distribution are subject to the
// Boost Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// See http://www.boost.org for most recent version including documentation.
#include <climits>
#include <boost/limits.hpp>
#include <boost/static_assert.hpp>
template <class UnsignedInt>
class myclass
{
private:
BOOST_STATIC_ASSERT(sizeof(UnsignedInt) * CHAR_BIT >= 16);
BOOST_STATIC_ASSERT(std::numeric_limits<UnsignedInt>::is_specialized
&& std::numeric_limits<UnsignedInt>::is_integer
&& !std::numeric_limits<UnsignedInt>::is_signed);
public:
/* details here */
};
myclass<unsigned> m1; // this should be OK
//myclass<int> m2; // this should fail
myclass<unsigned char> m3; // and so should this
int main()
{
return 0;
}