有效的 C++03 模板代码无法在 C++11 中编译

Valid C++03 template code won't compile in C++11

我在编写有效的 C++03 模板代码时遇到了一个小问题(虽然很容易解决),它可以正常编译,但在使用 C++11 方言时无法编译。

问题出在模板参数解析处。以这段代码为例:

template <uint32_t number>
struct number_of_bits {
    enum  {
        value = 1 + number_of_bits<number >> 1>::value
    };
};

template <>
struct number_of_bits<0> {
    enum  {
        value = 0
    };
};

由于 C++11 现在允许“>>”完成将模板化参数作为最后一个参数的模板参数列表,因此在解析此代码时会产生问题。

我正在使用 GCC(版本 4.8.1)作为我的编译器,它使用命令行可以正常编译:

g++ test.cc -o test

但是当我添加-std=c++11命令行开关时编译失败:

g++ -std=c++11 test.cc -o test

这是 C++11 语言特性还是 GCC 中的错误?如果是这样的话,这是一个已知错误吗?

Clang++ 在 -std=c++03 模式下给我一个警告:

test.cpp:6:43: warning: use of right-shift operator ('>>') in template argument
      will require parentheses in C++11 [-Wc++11-compat]
        value = 1 + number_of_bits<number >> 1>::value
                                          ^
                                   (          )

事实上,在 C++11 中修改了解析规则,因此 >> 总是在模板上下文中关闭模板参数。正如警告所指出的那样,您应该只在参数周围放置括号以解决解析问题:

value = 1 + number_of_bits<(number >> 1)>::value