提问者:小点点

带有GCC和clang的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给出了以下错误消息:

在“const_字符串”的constexpr扩展中((*

但是,如果我更改打印

这到底是怎么回事?根据标准,哪个编译器是正确的?


共1个答案

匿名用户

这是一个bug,似乎是在GCC5上编译的,如下所示。