如何判断constexpr是否返回引用

问题描述 投票:5回答:2

如果你有一个if constexpr ()决定做一件事或另一件事的函数,如何在一个案例中返回一个左值,在另一个案例中返回右值?

以下示例不在第一个用法行中编译,因为返回类型auto不是引用:

static int number = 15;

template<bool getref>
auto get_number(int sometemporary)
{
    if constexpr(getref)
    {
        return number; // we want to return a reference here
    }
    else
    {
        (...) // do some calculations with `sometemporary`
        return sometemporary;
    }
}

void use()
{
    int& ref = get_number<true>(1234);
    int noref = get_number<false>(1234);
}
c++ c++17 constexpr auto if-constexpr
2个回答
11
投票

如何在一个案例中返回左值,在另一个案例中返回右值?

我想你可以试试decltype(auto)和几个括号

template<bool getref>
decltype(auto) get_number() // "decltype(auto)" instead of "auto"
{
    if constexpr(getref)
    {
        return (number); // not "number" but "(number)"
    }
    else
    {
        return 123123; // just a random number as example
    }
}

4
投票

std::ref似乎为我做了诀窍:

#include <functional>
#include <iostream>

static int number = 15;

template<bool getref>
auto get_number()
{
    if constexpr(getref)
    {
        return std::ref(number); // we want to return a reference here
    }
    else
    {
        return 123123; // just a random number as example
    }
}

int main(int argc, char **argv)
{
    int& ref = get_number<true>();
    int noref = get_number<false>();

    std::cout << "Before ref " << ref << " and number " << number << std::endl;
    ref = argc;
    std::cout << "After ref " << ref << " and number " << number << std::endl;

    std::cout << "Before noref " << noref << " and number " << number << std::endl;
    noref = argc * 2;
    std::cout << "After noref " << noref << " and number " << number << std::endl;
}

Try it online!

正如预期的那样,改变ref会改变number(而不是noref),而改变noref则不会改变其他任何东西。

由于行为是constexpr和模板,返回std::refnumber迫使它实际上作为参考。

© www.soinside.com 2019 - 2024. All rights reserved.