与GCC和clang的constexpr char数组

时间:2015-04-25 14:21:21

标签: c++ arrays c++11 language-lawyer constexpr

请考虑以下代码:

#include <cstddef>
#include <iostream>
#include <stdexcept>

class const_string {
public:
    template <std::size_t sz>
    constexpr const_string(const char (&str)[sz]): p_(str) {}
    constexpr char operator[](std::size_t i) const { return p_[i]; }
private:
    const char* p_;
};

template <char c>
void Print() { std::cout << c << '\n'; }

int main() {
    constexpr char str[] = "Hello World";
    Print<const_string(str)[0]>();
}

用clang编译好,而GCC给出以下错误信息:

in constexpr expansion of 'const_string((* & str)).const_string::operator[](0ul)' error: '(const char*)(& str)' is not a constant expression

但是,如果我将Print<const_string(str)[0]>();更改为Print<const_string("Hello World")[0]>();。 clang和GCC都编译得很好。

这里发生了什么?哪个编译器根据标准是正确的?

1 个答案:

答案 0 :(得分:1)

它是bug,似乎在gcc 5上编译,如here所示。