Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada Fungsi Constexpr?

Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada Fungsi Constexpr?

Susan Sarandon
Susan Sarandonasal
2024-11-15 08:57:02537semak imbas

Why Can't I Pass Non-Constexpr Arguments to a Constexpr Function?

Limitations of Constexpr Function Parameters in Constant Expressions

Consider the code snippet:

static constexpr int make_const(const int i){
    return i;
}

void t1(const int i)
{
    constexpr int ii = make_const(i);  // error occurs here (i is not a constant expression)
    std::cout<<ii;
}

Error Details

The code triggers an error when attempting to initialize ii with make_const(i) because i is not a constant expression. This is because:

  • A constexpr variable is a variable with a value guaranteed to be available at compile time.
  • A constexpr function is a function that evaluates at compile time when provided with constexpr arguments.

Passing a non-constexpr parameter to a constexpr function does not result in a constexpr output. However, the constexpr function can inherit and propagate the constexprness of its input parameters.

Allowed Scenarios

The following code works because both t1() and make_const() are constexpr functions with constexpr parameters:

constexpr int t1(const int i)
{
    return make_const(i);
}

Limitations

The following code fails because do_something() is not a constexpr function, even though make_const() is:

template<int i>
constexpr bool do_something(){
    return i;
}

constexpr int t1(const int i)
{
    return do_something<make_const(i)>();   // error occurs here (i is not a constant expression)
}

Conclusion

Understanding the distinction between constexpr functions and variables is crucial to avoid such errors. Constexpr functions offer the flexibility of being evaluated at both compile-time and run-time, but only with constexpr arguments.

Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menyalurkan Hujah Bukan Constexpr kepada Fungsi Constexpr?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn