C++11 “GCC生产”;无法转换";使用聚合初始化时出错

C++11 “GCC生产”;无法转换";使用聚合初始化时出错,c++11,gcc,clang,C++11,Gcc,Clang,我试图在编译时使用如下代码计算C字符串大小: #include <stdio.h> #include <stdint.h> class StringRef { public: template<int N> constexpr StringRef(const char (&str)[N]) : m_ptr(str), m_size(uint32_t(N-1)) {} constexpr const char

我试图在编译时使用如下代码计算C字符串大小:

#include <stdio.h>
#include <stdint.h>

class StringRef
{
public:
    template<int N>
    constexpr StringRef(const char (&str)[N])
        : m_ptr(str), m_size(uint32_t(N-1)) {}

    constexpr const char *constData() const
    { return m_ptr; }

private:
    const char *m_ptr;
    uint32_t m_size;
};

struct S
{
    StringRef str;
};

constexpr static const struct S list[] =
{
    "str",
};

int main()
{
    printf("%s\n", list[0].str.constData());

    return 0;
}
但代码变得丑陋,而且,叮当声不知怎么地正确理解了它


如果没有显式大括号,如何让gcc理解数组初始化?

它不会变得更漂亮,但是
constepr static const struct S list[]={StringRef(“str”)}
适用于
g++
。还使用
constexpr static const StringRef list[]={“str”}工作。不确定,但我想这都是因为
g++
无法进行一些隐式转换。是的。所有其他方法都是可行的。只有struct init有问题。它没有变得更漂亮,但是
constexpr static const struct S list[]={StringRef(“str”)}
适用于
g++
。还使用
constexpr static const StringRef list[]={“str”}工作。不确定,但我想这都是因为
g++
无法进行一些隐式转换。是的。所有其他方法都是可行的。只有struct init有问题。
constexpr static const struct S list[] =
{{
    { "str" },
}};