具有std :: string的文字类仅适用于模板专业化?

马特

我的编译器不允许使用以下定义,因为std::string它具有非平凡的析构函数(在teststr没有成员的情况下不能有平凡的dtor是有意义的):

class teststr
{
private:
    std::string _m;
public:
    constexpr teststr(std::string value) : _m(value) {};

    constexpr std::string m() const { return _m; }
    void m(std::string value) { _m = value; }
};

但是,teststr允许以下等效(据我所知)的定义

template<typename T>
class test
{
private:
    T _m;
public:
    constexpr test(T value) : _m(value) {};

    constexpr T m() const { return _m; }
    void m(T value) { _m = value; }
};

typedef test<std::string> teststr;

模板化允许该定义的类型是什么?

用户名

constexpr通常在模板中允许使用,因为在模板定义时通常不知道成员是否满足的要求constexpr声明模板成员后constexpr,将在模板实例化时确定是否constexpr合适,如果不合适,则将其静默删除。

给定

template <typename T> struct test {
  T val;
  constexpr test(T val) : val(val) { }
};

你可以有

constexpr test<int> i = 3;

因为使用T = int,构造函数满足的要求constexpr,但您不能拥有

constexpr test<string> s = "";

因为构造函数不符合的要求constexpr

实例化这并非难事,test<string>因为这将严重限制constexpr在模板中使用的能力

从标准(C ++ 11):

7.1.5 constexpr说明符[dcl.constexpr]

6如果constexpr函数模板或类模板的成员函数的实例化模板特化无法满足对constexpr函数或constexpr构造函数的要求,则该特化不是constexpr函数或constexpr构造函数。[...]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有特定模板化类的模板专业化

来自分类Dev

具有模板化功能的专业化模板类

来自分类Dev

具有模板化功能的专业化模板类

来自分类Dev

具有容器模板的总类模板专业化

来自分类Dev

具有多种类型的类的模板专业化

来自分类Dev

模板类(如std :: function)的部分模板专业化

来自分类Dev

带有指针模板参数的模板类的专业化

来自分类Dev

带有模板的类模板专业化

来自分类Dev

具有类型和模板模板参数的模板类中类型参数的部分专业化

来自分类Dev

具有std :: if_enabled_t参数的模板功能的完全专业化

来自分类Dev

没有布尔数组的类模板专业化?

来自分类Dev

具有相关值的模板专业化

来自分类Dev

具有类型转换的模板专业化

来自分类Dev

具有编译时间常数的模板专业化

来自分类Dev

具有继承的C ++模板部分专业化

来自分类Dev

具有STL容器的部分C ++模板专业化

来自分类Dev

具有部分专业化的模板子类化

来自分类Dev

具有模板专业化的泛型类型转换

来自分类Dev

具有编译时间常数的模板专业化

来自分类Dev

具有部分专业化的模板子类化

来自分类Dev

std :: hash模板部分专业化

来自分类Dev

模板部分专业化不适用于typedef

来自分类Dev

是否要求具有T = <未命名命名空间的类>的功能模板专业化的静态局部语言唯一?

来自分类Dev

Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

来自分类Dev

Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

来自分类Dev

接受const / volatile资格和&vs &&&的所有版本的类模板专业化

来自分类Dev

C ++类模板专业化,而无需重新实现所有功能

来自分类Dev

当类具有多个模板参数时,对成员模板进行专业化处理?

来自分类Dev

当类具有多个模板参数时,对成员模板进行专业化处理?

Related 相关文章

  1. 1

    具有特定模板化类的模板专业化

  2. 2

    具有模板化功能的专业化模板类

  3. 3

    具有模板化功能的专业化模板类

  4. 4

    具有容器模板的总类模板专业化

  5. 5

    具有多种类型的类的模板专业化

  6. 6

    模板类(如std :: function)的部分模板专业化

  7. 7

    带有指针模板参数的模板类的专业化

  8. 8

    带有模板的类模板专业化

  9. 9

    具有类型和模板模板参数的模板类中类型参数的部分专业化

  10. 10

    具有std :: if_enabled_t参数的模板功能的完全专业化

  11. 11

    没有布尔数组的类模板专业化?

  12. 12

    具有相关值的模板专业化

  13. 13

    具有类型转换的模板专业化

  14. 14

    具有编译时间常数的模板专业化

  15. 15

    具有继承的C ++模板部分专业化

  16. 16

    具有STL容器的部分C ++模板专业化

  17. 17

    具有部分专业化的模板子类化

  18. 18

    具有模板专业化的泛型类型转换

  19. 19

    具有编译时间常数的模板专业化

  20. 20

    具有部分专业化的模板子类化

  21. 21

    std :: hash模板部分专业化

  22. 22

    模板部分专业化不适用于typedef

  23. 23

    是否要求具有T = <未命名命名空间的类>的功能模板专业化的静态局部语言唯一?

  24. 24

    Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

  25. 25

    Clang无法在模板类专门化中编译模板函数,该模板类专业化具有与模板声明不同的返回类型

  26. 26

    接受const / volatile资格和&vs &&&的所有版本的类模板专业化

  27. 27

    C ++类模板专业化,而无需重新实现所有功能

  28. 28

    当类具有多个模板参数时,对成员模板进行专业化处理?

  29. 29

    当类具有多个模板参数时,对成员模板进行专业化处理?

热门标签

归档