Tho*_*ell 2 c++ templates initialization variadic-templates c++11
我试图编译以下小例子:
template <typename T, std::size_t... Sizes>
class Foo {
public:
const std::size_t rank = sizeof...(Sizes);
const std::size_t dimensions[sizeof...(Sizes)] = { Sizes... };
};
int main()
{
Foo<int, 1, 2, 3> foo;
std::cout << "Rank: " << foo.rank << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它没有编译与gcc-4.8.1抱怨;成员声明结束时缺乏和...令牌前缺乏预期的不合格ID .但是,如果我用以下内容替换这两个成员,它将按预期编译并工作:
const std::size_t rank = 5;
const std::size_t dimensions[5] = {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)
为什么我不能使用sizeof...和Sizes...作为编译时常量,肯定两者都是在编译时已知和评估的,因此可以用于非静态数据成员初始化?此外,如果我rank = 5用rank = sizeof(int)它替换编译并按预期工作,所以它似乎不是一个问题sizeof.
这是我的示范理念.
这是在gcc 4.9中修复的gcc bug 57673.gcc 4.8的修复是添加一组额外的括号.
const std::size_t rank = (sizeof...(Sizes));
Run Code Online (Sandbox Code Playgroud)