Constexpr non member 函数和引用 Argos

Constexpr non member function and reference Argos

本文关键字:引用 Argos 函数 non member Constexpr      更新时间:2023-10-16

如果我有一个非成员 constexpr 函数采用引用参数,它必须是常量引用

简短回答:不。

长答案:不,因为 const 运算符只确保非成员函数的数据不会被更改 - 但是,如果您传递参数,此外来参数可能会更改

如果我有一个非成员 constexpr 函数采用引用参数,它必须是常量引用吗?

不,它没有,但它更好。

constexpr函数的主要用途是在编译时计算表达式。传递对此类函数的非const引用是没有意义的。如果你选择修改函数中的输入对象,我得问你为什么?如果不修改输入对象,最好使用 const 引用,就像将不修改对象的成员函数设为const成员函数一样。

以下代码不起作用,因为当函数需要非const引用时,无法使用临时对象

struct Foo { int i; };
constexpr bar(Foo& f) { return f.i * 2; }
int main()
{
   int arr[bar({20})]; // Can't use a temp object
}

以下代码有效。该函数可以与临时对象以及可用作左值的对象一起使用。

struct Foo { int i; };
constexpr bar(Foo const& f) { return f.i * 2; }
int main()
{
   int arr[bar({20})];
   Foo f{20};
   int v = bar(f);
}