Mor*_*enn 10 c++ language-lawyer constexpr variable-templates c++14
我试图constexpr像这样向前声明一个变量模板:
template<typename>
constexpr std::size_t iterator_category_value;
Run Code Online (Sandbox Code Playgroud)
我们的目标是记录每一项专业都应该是,constexpr但我必须承认,我从未检查过它是否合法,而且g ++对它很满意.但是,当我尝试使用clang ++编译此spinnet时,我收到以下错误:
Run Code Online (Sandbox Code Playgroud)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变量,它不是一个变量模板,所以变量模板上下文似乎是编译器不同意的原因.
在C++ 14标准中,似乎很清楚需要初始化.从第7.5.1节第9段开始,
constexpr对象声明中使用的说明符将对象声明为const.这样的对象应具有文字类型并应初始化.
至于"对象声明"的确切含义,第7节第7段规定:
如果decl-specifier-seq不包含typedef说明符,则如果与名称关联的类型是函数类型,则声明称为函数声明,否则称为对象声明.
铿锵是对的.所述声明的变量模板的是一个对象的声明([dcl.dcl]/9),因此,它必须提供一个初始化按[dcl.constexpr]/9:
constexpr对象声明中使用的说明符将对象声明为const.这样的对象应该被初始化.
但是,实际上没有办法像前面那样"向前"声明一个对象constexpr; 如果constexpr应用于变量的声明,则它应该是一个定义([dcl.constexpr]/1).
| 归档时间: |
|
| 查看次数: |
722 次 |
| 最近记录: |