我试图理解为什么编译器在这里抱怨:
// cexpr_test.cpp
#include <initializer_list>
constexpr int test_cexpr(std::initializer_list<const char*> x)
{
return (int) (*x.begin())[0]; // ensuring the value isn't optimized out.
}
int main()
{
constexpr int r1 = test_cexpr({ "why does this work," });
constexpr std::initializer_list<const char*> broken { "but this doesn't?" };
constexpr int r2 = test_cexpr(broken);
return r1 + r2;
}
Run Code Online (Sandbox Code Playgroud)
编译时产生的消息
g++ -std=c++11 -Wall -Werror cexpr_test.cpp
Run Code Online (Sandbox Code Playgroud)
如下:
cexpr_test.cpp:在函数“int main()”中:cexpr_test.cpp:12:76:错误:“const std::initializer_list{((const char* const*)(&)), 1}”不是常量表达式 12 | constexpr std::initializer_list 损坏 {“但这不是?” }; |
令人困惑的是,为什么它在没有任何问题的情况下构建第一个初始化列表。我在这里缺少什么?
c++ string-literals initializer-list language-lawyer constexpr