相关疑难解决方法(0)

未定义的对静态constexpr char []的引用

我想static const char在班上有一个数组.海湾合作委员会抱怨并告诉我应该使用constexpr,虽然现在它告诉我这是一个未定义的参考.如果我使数组成为非成员,那么它将编译.到底是怎么回事?

// .hpp
struct foo {
  void bar();
  static constexpr char baz[] = "quz";
};

// .cpp
void foo::bar() {
  std::string str(baz); // undefined reference to baz
}
Run Code Online (Sandbox Code Playgroud)

c++ static-members constexpr c++11

168
推荐指数
5
解决办法
4万
查看次数

静态constexpr成员的统一初始化

根据: constexpr静态数据成员给出未定义的引用错误 静态constexpr类成员必须满足两个要求:

template <typename Tp>
struct wrapper {
  static constexpr Tp value{}; // 1
};

template<typename Tp>
constexpr Tp wrapper<Tp>::value; // 2 

struct foo {
};

int main() {
  auto const& x = wrapper<foo>::value;
  (void)x;    
}
Run Code Online (Sandbox Code Playgroud)
  1. 在类定义中初始化(因为它是constexpr)
  2. 在类定义之外定义(因为它是静态的)

如果我改变1.统一初始化

template <typename Tp>
struct wrapper {
  static constexpr auto value = Tp{}; // uniform initialization
};

template<typename Tp>
constexpr Tp wrapper<Tp>::value;
Run Code Online (Sandbox Code Playgroud)

编译器抱怨冲突的声明:

$ g++ prog.cc -Wall -Wextra -std=c++1z -pedantic
prog.cc:7:31: error: conflicting declaration 'constexpr const Tp wrapper<Tp>::value' constexpr Tp wrapper<Tp>::value; …
Run Code Online (Sandbox Code Playgroud)

c++ static-members uniform-initialization constexpr c++11

8
推荐指数
1
解决办法
711
查看次数