“static_assert”是在 C++11 中作为语言关键字引入的——不是函数或宏。
两个编译器都给你“我不知道这个函数”警告/错误。
为了让编译器在您使用“static_assert”时为您提供“我不知道这个函数”,编译器不得使用 C++11 支持 (-std=c++11) 进行编译。
为了证明这一点,我采用了以下代码:
#include <bitset>
template<size_t tBits>
int DoIO(std::bitset<tBits>& /*bitsetToSerialize*/)
{
static_assert(tBits <= sizeof(unsigned long) * 8, "tBits is too big.");
return tBits;
}
然后我用 GCC 4.7.3 编译它,我得到了以下错误:
osmith@olivia64 ~/src $ g++ -o sa.o -c sa.cpp
sa.cpp:在函数'int DoIO(std::bitset<_Nb>&)'中:
sa.cpp:6:78: 错误:“static_assert”没有依赖于模板参数的参数,因此“static_assert”的声明必须可用 [-fpermissive]
sa.cpp:6:78: 注意:(如果你使用'-fpermissive',G++ 将接受你的代码,但不允许使用未声明的名称)
然后我在启用 C++11 支持的情况下编译它并且编译没有问题:
osmith@olivia64 ~/src $ g++ -std=c++11 -o sa.o -c sa.cpp -Wall
osmith@olivia64 ~/src $
所以,然后我用 Clang 编译它
osmith@olivia64 ~/src $ clang++ -o sa.o -c sa.cpp
sa.cpp:6:9:错误:使用未声明的标识符“static_assert”;你是说'static_cast'吗?
static_assert(tBits <= sizeof(unsigned long) * 8, "tBits 太大了。");
^
产生 1 个错误。
最后我使用 C++ 11 支持的 Clang 编译它,它编译得很好。
osmith@olivia64 ~/src $ clang --version
Ubuntu clang 版本 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (基于 LLVM 3.2)
目标:x86_64-pc-linux-gnu
线程模型:posix
osmith@olivia64 ~/src $ clang++ -std=c++11 -o sa.o -c sa.cpp
osmith@olivia64 ~/src $
可以肯定的是,让编译器有机会帮助我们并打开“-Wall”:
osmith@olivia64 ~/src $ g++ -Wall -o sa.o -c sa.cpp
sa.cpp:6:9:警告:标识符“static_assert”是 C++11 [-Wc++0x-compat] 中的关键字
sa.cpp:在函数'int DoIO(std::bitset<_Nb>&)'中:
sa.cpp:6:78: 错误:“static_assert”没有依赖于模板参数的参数,因此“static_assert”的声明必须可用 [-fpermissive]
sa.cpp:6:78: 注意:(如果你使用'-fpermissive',G++ 将接受你的代码,但不允许使用未声明的名称)