我可以只为特定的专业化定义静态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
的任何其他参数都将失败。
相关文章:
- #为""定义宏;静态";针对不同的上下文
- 静态结构和一个定义规则
- 静态变量声明和定义
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 我可以在运行时重新定义在 OpenCascade/OCCT 标头中定义的 c++ 静态常量吗?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 如何在C++中定义静态成员结构
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 指向重载静态成员的函数指针 - 在unique_ptr中用作自定义删除器
- Qt 静态库未定义引用
- 如何将 AST 用于自定义前端操作和 clang 静态分析
- 关于静态常量数据模因的声明和定义的混淆
- 如何在定义时静态检查模板化类?
- C++对象布局是否必须静态定义?
- 何时需要定义类的静态数据成员 (un/-)
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 为什么 gcc 7.3 接受静态定义中的'this'?
- SFML-对象静态定义
- 缩短静态定义
- 基于变量值C/C++静态定义数组