Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正向声明constexpr变量模板_C++_Language Lawyer_C++14_Constexpr_Variable Templates - Fatal编程技术网

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