“abc”[0] 不是编译时常量
Posted
技术标签:
【中文标题】“abc”[0] 不是编译时常量【英文标题】:"abc"[0] not a compile-time constant 【发布时间】:2014-02-24 13:49:12 【问题描述】:我有这个代码:
template< char... chars >
struct VariadicTemplate
;
int
main()
VariadicTemplate< "abc"[ 0 ], "abc"[ 1 ], "abc"[ 2 ] > v;
这与 mingw-w64 4.8.1 编译得很好。但是,在 MSVC 2013 和 VC++ 十一月 CTP 下同样无法编译,出现错误:
错误 1 错误 C2975:“chars”:“VariadicTamplate”的模板参数无效,预期的编译时常量表达式
哪个“否”或“部分”指的是这个? http://blogs.msdn.com/b/vcblog/archive/2013/12/02/c-11-14-core-language-features-in-vs-2013-and-the-nov-2013-ctp.aspx
如果没有,这是编译器错误吗?
【问题讨论】:
好奇,你知道它是否对非可变模板做同样的事情吗? 也许试试VariadicTemplate<'a', 'b', 'c'>
我认为这只是一般的constexpr
支持,已知并列为不完整。
好吧,c++ november CTP 声明对 constexpr 有部分支持,但成员函数除外,我认为不是这种情况
@DaliborFrivaldsky 它实际上说“CTP 支持 C++11 constexpr,但成员函数除外。(另一个限制是不支持数组。)”"abc"
是 @987654326 的数组@.
【参考方案1】:
这种从 C++03 到 C++11 的行为变化可以在 5.19 常量表达式中找到(两个标准的相同子句)。因此,我怀疑它会被 constexpr no/partial 覆盖。
请注意,作为 constexpr 功能参考的论文n2235 是引入对 5.19 的更改的地方:
4.5.3 常量表达式修改
段落修改。将第 5.19 节替换为 [...]
【讨论】:
以上是关于“abc”[0] 不是编译时常量的主要内容,如果未能解决你的问题,请参考以下文章