变异模板模板参数和GCC,Clang和MSVC中的差异大小 - 谁是对的?

cod*_*ife 2 g++ template-templates variadic-templates c++11 clang++

使用variadic模板模板参数时,要使用sizeof获取参数数量(...)GCC和Clang有不同的要求.GCC要求您填写可变参数的模板参数,而Clang要求您不要这样做.由于它们都声称符合标准,因此必须有错误或标准必须含糊不清(如果它们应在c ++ 1y中更正).

示例(http://ideone.com/5TWFKY上的完整可编辑示例):

template<template <class> class... T>
struct X
{
    /* code goes here */
};
Run Code Online (Sandbox Code Playgroud)

GCC(注意:在这种情况下,Z是任何非模板类):

static const constexpr size_t count = sizeof...(T<Z>);
Run Code Online (Sandbox Code Playgroud)

铛:

static const constexpr size_t count = sizeof...(T);
Run Code Online (Sandbox Code Playgroud)

MSVC 2013(完整性 - 与Clang w/out constexpr相同,不支持):

static const           size_t count = sizeof...(T);
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 5

这是gcc中的一个错误 ; 它已在gcc 4.9.0中修复.

从5.3.3 [expr.sizeof]:

5 - sizeof...表达式中的标识符应命名参数包.[...]