【发布时间】:2015-02-14 06:07:08
【问题描述】:
这是这个问题的后续:Is it legal to declare a constexpr initializer_list object?。
自 C++14 起,std::initializer_list 类的所有方法都标有constexpr。能够通过执行来初始化实例似乎很自然
constexpr std::initializer_list<int> list = {1, 2, 3};
但是 Clang 3.5 抱怨 list 没有被常量表达式初始化。
As dyp pointed out in a comment,任何要求 std::initializer_list 为文字类型的要求似乎都已从规范中消失。
如果我们甚至不能这样初始化一个类,那么将它完全定义为 constexpr 有什么意义呢?这是标准中的疏忽吗?将来会修复吗?
【问题讨论】:
-
Richard Smith 似乎暗示 here
std::initializer_list已成为文字类型。但是,我在标准中找不到这样的要求。第二个问题是“可以将 constexpr 非静态成员函数声明为非文字类型的成员吗?”,参见 CWG DR 1684 -
这很奇怪,当你把它放在全局范围内时,clang++ 会编译它:coliru.stacked-crooked.com/a/dab2834181fb8ea4(这是clang bug 15117)对我来说闻起来像另一个编译器错误。
-
“这是标准中的疏忽,将来会得到修复吗?” - 一般而言,C++14 是正确的。
-
仅作记录:GCC 4.9.1 对此没问题。
标签: c++ language-lawyer c++14 initializer-list constexpr