c++ - 关于constexpr函数的一个问题
天蓬老师
天蓬老师 2017-04-17 13:31:24
0
3
600

先看代码

#include <iostream>
#include <cstdlib>
#include <cstdio>
//#include "test.h"

using namespace std;

constexpr int screen(int x)
{
   return x; 
}


int main()
{   
    int x = 0;
    int z =  screen(x);
    cout << z<<endl;
    return 0;
}

  在C++ Primer一书中说到constexpr函数定义的约定:函数的返回类型以及所有的形参类型必须是字面值类型(即编译过程就能得到结果的类型)。但是同时又说constexpr函数不一定返回常量表达式。感觉前后有一些矛盾,就像上面的代码一样,通过 g++ test.cpp -std=c00x 的编译运行都是没有问题的,这里应该怎么理解?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回覆(3)
黄舟

看看這個:constexpr 函數不需要回傳常數表達式嗎?

黄舟

C++標準文件n45675.20小節講的就是這個

int main()
{   
    int x = 0;
    int z =  screen(x); //因为z是非constexpr的,不要求screen是constexpr的
    cout << z<<endl;
    return 0;
}
int main()
{   
    int x = 0;
    constexpr int z =  screen(x); //错误!! x的lifetime开始于screen(x)的外部
    cout << z<<endl;
    return 0;
}
int main()
{  
    constexpr int z =  screen(0); //screen(0)是常量表达式, 对于screen内部,x的lifetime开始于函数内部
    cout << z<<endl;
    return 0;
}
PHPzhong

  可以這樣認為:C++不要求constexpr函數必須傳回常數表達式(以問題中的screen constexpr函數為例)

  • 如果在不需要常數表達式的上下文,如: int z = screen(x); 可以不傳回常數表達式,此時編譯器不會檢查函數的結果是否會傳回常數表達式。

  • 如果是在需要常數表達式的上下文中,如: constexpr int z = screen(x); 那麼,constexpr函數必須可以傳回常數表達式。此時編譯器會去檢查函數回傳的結果是不是常數表達式,如果不是,就會報錯。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!