代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

constexpr函数及其参数

  •  2
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前
    constexpr int hello(int j) {
        return j * 12;
    }
    
    constexpr int bye(int j = 6) {
        return j * 12;
    }
    
    int main() {
        int i = 6;
        constexpr int a1 = hello(i); //error
        constexpr int a2 = hello(6); //ok
        constexpr int a3 = hello(int(6)); //ok
        constexpr int a4 = bye(); //ok
        constexpr int a5 = bye(i); //error
        constexpr int a6 = bye(6); //ok
        return 0;
    }
    

    两者的区别是什么 hellow(i) hello(6) ? 我想是的 int j = i; j不是constexpr,而另一个是 int j = 6 j仍然不是constexpr,两者都是 int 类型
    int*文字!=常量表达式 ,因此返回类型不是constexpr。

    我从书中的一个例子中得出了上述结论
    int staff_size = 27; //staff_size is not a const expression

    虽然staff\u size是从文本初始化的,但它不是一个常量表达式 因为它是一个普通的int,而不是const int。

    此外,我注意到 hello(int(6)) 也很好,这里的“东西”是什么?

    此外, bye() 工作时 hello(i) 不是,两个参数都在函数内部初始化,只有一个参数具有默认值,这有什么意义?

    很困惑,希望有人能解释一下:D

    附言:我不知道该找一个更好的标题,抱歉

    2 回复  |  直到 7 年前
        1
  •  3
  •   user402642 user402642    7 年前

    两者之间的区别 hello(6) hello(i) 那是 6 在里面 你好(6) 是一个 constexpr 函数参数,而 i 你好(我) 是普通的 int 参数

    如果您声明 未来 constexpr int i = 6; 然后 你好(我) 将编译并执行。

    在里面 hello(int(6)) ,你是说演员 6. ,一个整数文本,转换为int。这是一个冗余操作。 你好(int(6)) 你好(6) 如果行为不完全相同,也会有类似的行为。

    bye() 由于函数参数使用默认参数( j = 6 在里面 constexpr int bye(int j = 6); )。默认初始化参数在编译时已知,因此是 常量表达式 根据定义

        2
  •  1
  •   SirKM    7 年前

    这里需要注意的是,编译器“验证”代码,而不是“读取”代码。

    编译器希望constexpr的所有部分在编译时都是已知的有效常量。因此,虽然你和我都知道,通过阅读代码 i 从不更改,编译器不会“知道”它,除非您声明 是一个常数。就其而言,您可以在某处执行其他代码来更改

    在调用函数时不使用 ,编译器无疑知道 j 是一个值为的常量整数 6 ,(注: int(6) 和刚才一样 6. )。