未声明constexpr
,std::forward
将丢弃它转发参数的任何函数的并发性。 为什么std::forward
本身没有声明constexpr
本身,所以它可以保持constexpr?ness?为什么std :: forward放弃了constexpr- ness?
实施例:(带克测试++快照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);
}
注:在技术上,这将是容易使std::forward
constexpr,例如,像这样(注意,在克std::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
不喜欢fix::forward
界定?
注2:这个问题在一定程度上关系到我的其他question about constexpr std::tuple为std::forward
不是constexpr
是技术原因std::tuple
无法通过调用它与右值CSTR创建,但在这里,这个问题显然是(多)更普遍。
快速提示,以'_ [A-Z]开头的标识符是为编译器实现者保留的。因此,您的计划不合格。 – 2011-02-24 07:13:15
而_T是特别讨厌,如果你应该移动到Windows,它是一个宏... – 2011-02-24 18:55:53
@Matthieu男,@波佩尔松谢谢。我用T等替换了所有名称_T,这样其他人可以更安全/更轻松地尝试代码。 – Lars 2011-02-24 21:48:11