2

简化版

class C {
 public:
 static constexpr std::array<C, 2> foo {{"1"_C, "2"_C}};
 int x;
 constexpr C(char c) { x=c; }
}
constexpr C operator"" _C(const char * str, size_t n) { return C(*str); }

这不会飞,因为在定义数组的那一行不理解文字。但是自由文字函数不能更早移动,因为那时 C 是未知的。

有没有不涉及在代码中添加可变参数模板或类似可怕的东西的解决方案?

4

1 回答 1

3

问题不在于用户定义的文字,而在于std::array需要完整类型的事实(或者实际上,任何constexpr初始化都需要)。以下代码也将无法编译:

#include <array>

class C {
public:
 static constexpr std::array<C, 2> foo {{C('1'), C('2')}};
 int x;
 constexpr C(char c) : x(c) {} // please use a mem-initializer-list
};

错误类似于(此处为 Clang 3.3 SVN):

/usr/include/c++/v1/array:136:16: 错误: 字段的类型“value_type”不完整
      (又名“C”)
    value_type __elems_[_Size > 0 ? _尺寸:1];
               ^
t.cpp:5:36:注意:在模板类 'std::__1::array' 的实例化中
      在这里请求
 static constexpr std::array<C, 2> foo {{C('1'), C('2')}};
                                   ^
t.cpp:3:7: 注意:'C' 的定义直到结束'}' 才完成
C类{
      ^
于 2012-12-04T01:26:25.697 回答