“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&lt;'a', 'b', 'c'&gt; 我认为这只是一般的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] 不是编译时常量的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sizeof 表达式不是像 2、4、8 等这样的编译时常量?

MSVC 抱怨函数指针不是编译时常量

如何在 C++11 中创建结构的编译时常量实例

java 常量池详解

编译时常量和变量

从文字字符串生成编译时常量整数