gpt4 book ai didi

c++ - 在 constexpr 函数体 c++14 中可以有非文字类型的定义变量吗?

转载 作者:可可西里 更新时间:2023-11-01 15:52:05 25 4
gpt4 key购买 nike

我认为在 C++14 中,更多限制已从 constexpr 中移除。但是根据 N3797 7.1.5 3-punct:


conexpr 函数的定义应满足以下约束:

  • 它不能是虚拟的
  • 它的返回类型应该是字面量类型;
  • 它的每个参数类型都应该是文字类型;
  • 它的函数体应该是=delete,=default,或者一个复合语句不包含:
  • asm-definition,
  • goto 语句,
  • try-block,或者
  • 非文字类型或静态或线程存储持续时间或没有初始化的变量的定义执行。

我知道为什么静态的线程存储持续时间变量是不允许的,但我没有看到任何原因,为什么只允许定义文字类型的变量?

或者我不明白标准。

我不确定,但根据标准,即使是 C++14 也应该创建以下错误:

struct point{
constexpr point(): x(0), y(0){}
constexpr point(int x_, int y_): x(x_),y(y_){}
constexpr int hypot()const { return x*x + y*y; }
int x,y;
};

constexpr int hypot(int x, int y) {
point p{x,y}; //error, because p - is not literal type.
return p.hypot();
}

// error, because return type is not literal.
constexpr point getPoint(int x, int y) { return {x,y}; }

// error, because parameter is not literal.
constexpr int hypot(point p) { return p.hypot(); }

问:如果真的会出现上述错误,为什么不取消这些限制?

最佳答案

文字类型在 3.9/10 中定义:

A type is a literal type if it is:

  • void; or

  • a scalar type; or

  • a reference type; or

  • an array of literal type; or

  • a class type (Clause 9) that has all of the following properties:

    • it has a trivial destructor,

    • it is an aggregate type (8.5.1) or has at least one constexpr constructor or constructor template that is not a copy or move constructor, and

    • all of its non-static data members and base classes are of non-volatile literal types

因此您的结构 point 文字类型并且您的示例代码是有效的 C++1y。

至于为什么 constexpr 函数仅限于文字类型的变量,它们是唯一保证在编译时可解释的类型。

关于c++ - 在 constexpr 函数体 c++14 中可以有非文字类型的定义变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21787488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com