未声明constexpr
,std::forward
将丢弃将参数转发到的任何函数的 constexpr-ness。为什么std::forward
不声明constexpr
自己,以便它可以保留 constexpr-ness?
示例:(使用 g++ snapshot-2011-02-19 测试)
#include <utility>
template <typename T> constexpr int f(T x) { return -13;}
template <typename T> constexpr int g(T&& x) { return f(std::forward<T>(x));}
int main() {
constexpr int j = f(3.5f);
// next line does not compile:
// error: ‘constexpr int g(T&&) [with T = float]’ is not a constexpr function
constexpr int j2 = g(3.5f);
}
注意:从技术上讲,制作 constexpr 很容易std::forward
,例如,像这样(请注意,在 gstd::forward
中已替换为fix::forward
):
#include <utility>
namespace fix {
/// constexpr variant of forward, adapted from <utility>:
template<typename Tp>
inline constexpr Tp&&
forward(typename std::remove_reference<Tp>::type& t)
{ return static_cast<Tp&&>(t); }
template<typename Tp>
inline constexpr Tp&&
forward(typename std::remove_reference<Tp>::type&& t)
{
static_assert(!std::is_lvalue_reference<Tp>::value, "template argument"
" substituting Tp is an lvalue reference type");
return static_cast<Tp&&>(t);
}
} // namespace fix
template <typename T> constexpr int f(T x) { return -13;}
template <typename T> constexpr int g(T&& x) { return f(fix::forward<T>(x));}
int main() {
constexpr int j = f(3.5f);
// now compiles fine:
constexpr int j2 = g(3.5f);
}
我的问题是:为什么std::forward
不定义 like fix::forward
?
注意2:这个问题与我关于 constexpr std::tuple的另一个问题有些相关,因为std::forward
not being是为什么不能通过用右值调用它的 cstr 来创建constexpr
的技术原因,但这里的这个问题显然(更)更普遍。std::tuple