确定是否通过临时

Cli*_*ton 1 c++ c++11

假设我有一个类C,以及一个make_c(x)创建C实例的函数.

C商店x参考.

make_c(x)x一个未命名的临时(当然会在行尾破坏,留下悬空引用)但是接受命名的临时值和其他值时,我如何编写以编译错误?

ild*_*arn 5

我相信这应该有你正在寻找的语义:

template<typename X>
C make_c(X&& x)
{
    static_assert(
        !std::is_rvalue_reference<decltype(std::forward<X>(x))>::value,
        "x must not be a temporary"
    );
    return C(std::forward<X>(x));
}
Run Code Online (Sandbox Code Playgroud)

警告:这会不会是由于其实施的不足之处上班,是用VC++ 2010 decltype(你需要包装decltypestd::identity<>).