为什么模板允许constexpr函数成员与非constexpr构造函数一起使用?

丹尼尔

使用C ++ 14。为什么会这样编译:

template<unsigned N>
constexpr bool foo()
{
    std::array<char, N> arr;
    return true;
}

但是不是吗?

constexpr bool foo()
{
    std::array<char, 10> arr; // Non-constexpr constructor 'array' cannot be used in a constant expression
    return true;
}
TC

§7.1.5[dcl.constexpr] / p6:

如果constexpr函数模板或类模板的成员函数的实例化模板特化不能满足对constexpr函数或constexpr构造函数的要求,则即使对此类函数的调用不能出现在常量中,该特化仍为constexpr函数或constexpr构造函数。表达。如果在将模板视为非模板函数或构造函数时,如果模板的专业化不能满足对constexpr函数或constexpr构造函数的要求,则模板格式错误;无需诊断。

它是有效的constexpr函数模板有一些特例不符合constexpr要求的,也是有效的利用这些专长,只要他们不是用在需要常量表达式的上下文。

但是,如果模板的专业化不能满足constexpr要求,那将是无效的由于在一般情况下无法确定功能模板的所有可能实例化是否都不能满足constexpr要求,因此该标准不需要诊断。因此,您的代码格式错误,不需要诊断-编译器可以但不要求报告错误。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要在构造函数上使用constexpr?

来自分类Dev

具有非constexpr构造函数的constexpr非静态成员函数(gcc,clang不同)

来自分类Dev

为什么constexpr函数可以与在运行时生成的变量一起很好地工作?

来自分类Dev

什么时候可以在constexpr成员函数中使用非const成员?

来自分类Dev

constexpr构造函数上是否允许使用return语句?

来自分类Dev

为什么constexpr不适用于构造函数?

来自分类Dev

内部类和公共构造函数-为什么它与Activator.CreateInstance一起使用?

来自分类Dev

为什么不能要求构造函数并立即将其与browserify一起使用?

来自分类Dev

为什么不能要求构造函数并立即将其与browserify一起使用?

来自分类Dev

非constexpr函数在constexpr构造函数中的使用有效

来自分类Dev

为什么我可以在constexpr函数中调用非constexpr函数?

来自分类Dev

如何使用模板化constexpr成员函数初始化constexpr std :: array?

来自分类Dev

为什么在调用此constexpr静态成员函数时不将其视为constexpr?

来自分类Dev

Constexpr成员函数

来自分类Dev

std :: abs可以在constexpr函数中使用,但前提是必须将其模板化。为什么?

来自分类Dev

为什么decltype无法与重载函数一起使用?

来自分类Dev

为什么在Javabean中创建非arg构造函数成为惯例?

来自分类Dev

为什么Visual Studio允许我在模板函数(C ++)中使用私有成员?

来自分类Dev

为什么将emplace_back与删除的副本构造函数一起使用不起作用?

来自分类Dev

如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

来自分类Dev

如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

来自分类Dev

在constexpr类的构造函数外部使用构造函数参数

来自分类Dev

为什么我的constexpr对象不在函数内的constexpr?

来自分类Dev

为什么函数指针可以是`constexpr`?

来自分类Dev

为什么constexpr函数的行为与参考不同?

来自分类Dev

带有constexpr成员函数的constexpr构造函数调用的C ++ VS2015 constexpr编译错误

来自分类Dev

当您可以使用consteval函数创建constexpr对象时,为什么constexpr函数不能消耗consteval函数?

来自分类Dev

constexpr默认的默认构造函数

来自分类Dev

Constexpr可构造函数对象

Related 相关文章

  1. 1

    为什么要在构造函数上使用constexpr?

  2. 2

    具有非constexpr构造函数的constexpr非静态成员函数(gcc,clang不同)

  3. 3

    为什么constexpr函数可以与在运行时生成的变量一起很好地工作?

  4. 4

    什么时候可以在constexpr成员函数中使用非const成员?

  5. 5

    constexpr构造函数上是否允许使用return语句?

  6. 6

    为什么constexpr不适用于构造函数?

  7. 7

    内部类和公共构造函数-为什么它与Activator.CreateInstance一起使用?

  8. 8

    为什么不能要求构造函数并立即将其与browserify一起使用?

  9. 9

    为什么不能要求构造函数并立即将其与browserify一起使用?

  10. 10

    非constexpr函数在constexpr构造函数中的使用有效

  11. 11

    为什么我可以在constexpr函数中调用非constexpr函数?

  12. 12

    如何使用模板化constexpr成员函数初始化constexpr std :: array?

  13. 13

    为什么在调用此constexpr静态成员函数时不将其视为constexpr?

  14. 14

    Constexpr成员函数

  15. 15

    std :: abs可以在constexpr函数中使用,但前提是必须将其模板化。为什么?

  16. 16

    为什么decltype无法与重载函数一起使用?

  17. 17

    为什么在Javabean中创建非arg构造函数成为惯例?

  18. 18

    为什么Visual Studio允许我在模板函数(C ++)中使用私有成员?

  19. 19

    为什么将emplace_back与删除的副本构造函数一起使用不起作用?

  20. 20

    如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

  21. 21

    如何强制执行复制省略,为什么它不能与已删除的复制构造函数一起使用?

  22. 22

    在constexpr类的构造函数外部使用构造函数参数

  23. 23

    为什么我的constexpr对象不在函数内的constexpr?

  24. 24

    为什么函数指针可以是`constexpr`?

  25. 25

    为什么constexpr函数的行为与参考不同?

  26. 26

    带有constexpr成员函数的constexpr构造函数调用的C ++ VS2015 constexpr编译错误

  27. 27

    当您可以使用consteval函数创建constexpr对象时,为什么constexpr函数不能消耗consteval函数?

  28. 28

    constexpr默认的默认构造函数

  29. 29

    Constexpr可构造函数对象

热门标签

归档