如何决定 constexpr 是否为 return 引用
How to decide constexpr to return a reference or not
如果您有一个 if constexpr ()
决定做某事或另一件事的函数,如何 return 在一种情况下使用左值而在另一种情况下使用右值?
以下示例不会在第一行使用中编译,因为 return 类型 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);
}
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;
}
正如预期的那样,更改 ref
会更改 number
(而不是 noref
),而更改 noref
不会更改任何其他内容。
由于行为是 constexpr
和模板化的,因此返回 number
的 std::ref
会强制它实际进行引用。
how to return an lvalue in one case and an rvalue in the other case?
我想你可以尝试使用 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
}
}
如果您有一个 if constexpr ()
决定做某事或另一件事的函数,如何 return 在一种情况下使用左值而在另一种情况下使用右值?
以下示例不会在第一行使用中编译,因为 return 类型 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);
}
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;
}
正如预期的那样,更改 ref
会更改 number
(而不是 noref
),而更改 noref
不会更改任何其他内容。
由于行为是 constexpr
和模板化的,因此返回 number
的 std::ref
会强制它实际进行引用。
how to return an lvalue in one case and an rvalue in the other case?
我想你可以尝试使用 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
}
}