【发布时间】:2016-01-16 19:41:15
【问题描述】:
我尝试像这样转发声明constexpr 变量模板:
template<typename>
constexpr std::size_t iterator_category_value;
我们的目标是记录每个专业化都应该是constexpr,但我不得不承认我从未检查过它是否合法,g++ 对此很满意。但是,当我尝试用 clang++ 编译这个 spinnet 时,我得到了以下错误:
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
错误是有道理的,删除constexpr 会使它消失,所以这不是一个真正的问题。但是,我现在很好奇:标准是否允许对变量模板进行这样的constexpr 前向声明,还是非法? g++ 和 clang++ 似乎不同意,我想知道如果需要我应该在哪里提交错误报告。
他们都抱怨前向声明的 constepxr 变量不是变量模板,因此变量模板上下文似乎是编译器不同意的原因。
【问题讨论】:
-
wg21.cmeerw.net/cwg/issue1712 的文本暗示您不能将其转发声明为
constexpr,但我不太确定标准如何禁止它。变量模板在我看来不像是一个对象声明。 -
OTOH,[dcl.dcl]p9 看起来很笼统,应该适用于变量模板(=> 变量模板是对象声明=>
constexpr需要初始化) -
@dyp 顺便说一句,“现在”是什么意思?你不是在编译 Git 上当前可用的最新源代码吗?
-
@Columbo 不定期 :)
-
@dyp 是的,作为 object 声明 的变量模板声明对我来说并不是很明显,因此问题:/
标签: c++ language-lawyer c++14 constexpr variable-templates