C++ 正向声明constexpr变量模板
我尝试向前声明一个C++ 正向声明constexpr变量模板,c++,language-lawyer,c++14,constexpr,variable-templates,C++,Language Lawyer,C++14,Constexpr,Variable Templates,我尝试向前声明一个constexpr变量模板,如下所示: template<typename> constexpr std::size_t iterator_category_value; 这个错误是有意义的,删除constexpr会使它消失,所以这不是真正的问题。然而,我现在很好奇:标准是否允许对变量模板进行这样的constexpr转发声明,还是非法的?g++和clang++似乎不一致,我想知道如果需要,我应该在哪里提交错误报告 他们都抱怨前向声明的constepxr变量不是变量
constexpr
变量模板,如下所示:
template<typename>
constexpr std::size_t iterator_category_value;
这个错误是有意义的,删除constexpr
会使它消失,所以这不是真正的问题。然而,我现在很好奇:标准是否允许对变量模板进行这样的constexpr
转发声明,还是非法的?g++和clang++似乎不一致,我想知道如果需要,我应该在哪里提交错误报告
他们都抱怨前向声明的
constepxr
变量不是变量模板,因此变量模板上下文似乎是编译器不同意的地方。在C++14标准中,很明显需要初始化。根据第7.5.1节第9段
对象声明中使用的constepr
说明符
将对象声明为常量。这种物体应具有
应初始化文本类型和
关于“目标声明”的确切含义,第7节第7段规定:
如果decl说明符seq不包含typedef说明符,
如果
与名称关联的类型是函数类型,并且
对象声明
叮当声是正确的。变量模板的声明是对象声明([dcl.dcl]/9),因此它必须按照[dcl.constexpr]/9提供初始值设定项:
对象声明中使用的constexpr
说明符声明
对象为常量
此类对象[…]应
已初始化。
然而,实际上没有一种方法可以“向前”将一个对象声明为
constexpr
;如果constexpr
应用于变量的声明,则它应是一个定义([dcl.constexpr]/1)。的文本意味着您不能将其转发声明为constexpr
,但我不太确定std如何禁止它。变量模板在我看来不像对象声明。OTOH,[dcl.dcl]p9似乎非常通用,应该应用于变量模板(=>变量模板是对象声明=>constepr
需要初始化)@dyp Btw,你说的“现在”是什么意思?你不是在编译Git上当前可用的最新源代码吗?@Columbo不经常:)@dyp是的,作为对象声明的变量模板声明对我来说并不明显,因此问题是:/只是一个包含讨论案例的代码。它包含constexpr
变量模板的正向声明,但编译很好。@您是否意识到您使用的编译器在这方面存在缺陷?是的,但我认为这一更改是在不久的过去引入的。可能是故意的。但也许不是这样。好吧,GCC只是从5.2开始支持所有使用的功能,而那个版本已经错误地编译了这个精巧的代码。
error: default initialization of an object of const type 'const std::size_t' (aka 'const unsigned long')
constexpr std::size_t iterator_category_value;
^
= 0