您能否举一个示例,用static_assert(...)('C++ 11')轻松解决问题?

我熟悉运行时assert(...)。我何时应该比常规static_assert(...)更喜欢assert(...)

另外,在boost中有一个叫做BOOST_STATIC_ASSERT的东西,它与static_assert(...)一样吗?

最佳答案

从我头顶上...

#include "SomeLibrary.h"

static_assert(SomeLibrary::Version > 2,
         "Old versions of SomeLibrary are missing the foo functionality.  Cannot proceed!");

class UsingSomeLibrary {
   // ...
};

假设SomeLibrary::Version声明为静态const,而不是#define d(就像在C++库中所期望的那样)。

与必须实际编译SomeLibrary和代码,链接所有内容并仅运行可执行文件相反,然后才发现您花了30分钟的时间来编译SomeLibrary的不兼容版本。

@Arak,针对您的评论:是的,从外观上,您可以将static_assert放在任何地方:
class Foo
{
    public:
        static const int bar = 3;
};

static_assert(Foo::bar > 4, "Foo::bar is too small :(");

int main()
{
    return Foo::bar;
}

$ g++ --std = c++ 0x a.cpp
a.cpp:7:错误:静态声明失败:“Foo::bar太小:(”

10-04 20:56