繁体   English   中英

我可以只为某些专业定义静态 constexpr 数据成员吗?

[英]Can I define a static constexpr data member only for certain specializations?

下面的程序工作得很好。

#include <iostream>
#include <type_traits>

template <typename DummyT = void>
struct wrapper
{
  static_assert(std::is_same<void, DummyT>::value, "Only void, please");
  static constexpr char text[] = "some string constant";
};

template <typename DummyT>
constexpr char wrapper<DummyT>::text[];

int
main()
{
  std::cout << wrapper<>::text << '\n';
}

但是,当我只为wrapper<void>定义wrapper::text

template <>
constexpr char wrapper<void>::text[];

然后 GCC 5.3.0 给了我这个链接器错误

/tmp/ccnGx3EP.o: In function `main':
main.cxx:(.text+0x5): undefined reference to `wrapper<void>::text'
collect2: error: ld returned 1 exit status

和 Clang 3.7.1 给了我这个错误。

main.cxx:12:31: error: declaration of constexpr static data member 'text' requires an initializer
constexpr char wrapper<void>::text[];
                              ^
1 error generated.

我想知道为什么仅为实际使用的专业化提供定义是不够的。 并不是说它非常有用,因为static constexpr成员必须在class定义中初始化,所以我无论如何都不能在定义中专门化它,但我可能想让它保持未定义状态。

容易地:

template <typename DummyT = void>
struct wrapper
{
  static_assert(std::is_same<void, DummyT>::value, "Only void, please");
};

template <>
struct wrapper<void>
{
  static constexpr char text[] = "some string constant";
};

constexpr char wrapper<void>::text[];

wrapper<>wrapper<void>都可以工作,而任何其他参数都会因static_assert失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM