首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常数函数必须预先定义吗?

常数函数必须预先定义吗?
EN

Stack Overflow用户
提问于 2017-01-14 07:03:38
回答 2查看 61关注 0票数 0

参见下面的代码,f()是在下面定义的,主函数被认为是格式错误吗?有人能给我解释一下吗?

代码语言:javascript
复制
constexpr  int f ();
void indirection ();
int main () {
  constexpr int n = f (); // ill-formed, `int f ()` is not yet defined
  indirection ();
}
constexpr int f () {
  return 0;
}
void indirection () {
  constexpr int n = f (); // ok
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-14 07:24:57

C++14标准提供了以下代码片段(为方便起见,由我缩短):

代码语言:javascript
复制
constexpr void square(int &x); // OK: declaration

struct pixel { 
    int x;
    int y;
    constexpr pixel(int); 
};

constexpr pixel::pixel(int a)
    : x(a), y(x) 
{ square(x); }

constexpr pixel small(2); // error: square not defined, so small(2)
                        // is not constant so constexpr not satisfied

constexpr void square(int &x) { // OK: definition
   x *= x;
}

解决方案是将square的定义移到small的声明之上。

从上面我们可以得出这样的结论:转发声明constexpr函数是很好的,但是它们的定义在第一次使用之前必须是可用的。

票数 2
EN

Stack Overflow用户

发布于 2017-01-14 07:14:38

constexpr必须在编译时,在使用它的每一点上都知道。

这与您不能声明不完整类型的变量本质上是一样的,即使该类型稍后在同一源中完全定义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41647636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档