为什么以下非静态数据成员初始化在C++ 11中无效

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 = 5rank = sizeof(int)它替换编译并按预期工作,所以它似乎不是一个问题sizeof.


这是我的示范理念.

Pra*_*ian 7

这是在gcc 4.9中修复的gcc bug 57673.gcc 4.8的修复是添加一组额外的括号.

const std::size_t rank = (sizeof...(Sizes));
Run Code Online (Sandbox Code Playgroud)

现场演示

  • 你也可以把它们变成`static constexpr`而不是非静态成员(它有一些额外的好处,恕我直言). (2认同)