c ++ 11:clang拒绝numeric_limits<>在我的模板定义中,而gcc接受它 - 这是对的吗?

时间:2013-02-13 12:36:35

标签: c++ gcc c++11 clang

违规代码:

template <class Bar, 
         size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
size_t foo(Bar const& b) { omitted... }

使用-std=c++11在gcc 4.7.2上编译正常。在clang 3.0上我收到以下错误:

foo.hpp:35:28: error: non-type template argument of type 'unsigned long' is not an integral constant expression
         size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

据我所知,我应该能够在c ++ 11中以这种方式使用numeric_limits。这里的铿锵有误,还是我没有意识到什么?

编辑:

编译标志为:clang++ -o foo.o -c -W -Wall -Wextra -Werror -std=c++11 -stdlib=libc++ -g -I. foo.cpp

2 个答案:

答案 0 :(得分:2)

您的代码使用clang ++ 3.2编译得很好,请参阅here

我想说你的代码没有任何问题,但是你应该升级到更新版本的clang。

注意:由于编译器错误,代码无法使用英特尔C ++编译器13.0.1编译(感谢@Xeo):

Compilation finished with errors:
source.cpp(6): internal error: assertion failed: ensure_il_scope_exists: NULL IL scope (shared/cfe/edgcpfe/il.c, line 7439)

size_t MAX_SIZE = std::numeric_limits<size_t>::max()>
^

compilation aborted for source.cpp (code 4)

答案 1 :(得分:1)

要使用带有clang的C ++ 11库特性,您需要使用libc ++标准库实现,否则您将从GCC 4.1.2获得古老的库,它不支持C ++ 11

请参阅https://stackoverflow.com/a/14790442/981959https://stackoverflow.com/a/14150421/981959以及许多其他问题。